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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzFlMjYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTQ4MmVjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YTJiZjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MWZiMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpwdC5wYXRjaC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTE1ZjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPkphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgMS4wLjIgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+SlRQIDIuMC4yIFBhdGNoZXM8L2gxPgotCi08aDI+RmVhdHVyZSBQYXRjaGVkOiBvcmcuZWNsaXBzZS5qcHQucGF0Y2g8L2gyPgotPGgzPlBsdWdpbihzKSByZXBsYWNlZDo8L2gzPgotPHVsPjxsaT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9saT48L3VsPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yMjAyOTcnPjIyMDI5NzwvYT4uIEVudGl0eSBnZW5lcmF0aW9uIGNyZWF0ZXMgRW1iZWRkYWJsZXMgd2l0aCBjb21waWxlIGVycm9ycyBpbiBzb21lIGNhc2VzLjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1N2VhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgUGF0Y2hlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVBhdGNoKHMpIGZvciBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scy4gXG5cCi1TZWUgYnVnIDIyMDI5NyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvMjIwMjk3KSBFbnRpdHkgZ2VuZXJhdGlvbiBjcmVhdGVzIEVtYmVkZGFibGVzIHdpdGggY29tcGlsZSBlcnJvcnMgaW4gc29tZSBjYXNlcyBcblwKLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmFlOTJiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3BhdGNoZXMvIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUGF0Y2hlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcGF0Y2hlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMi52MjAwODAyMTQwMTAwLTc3LTdfQ1lRQ0QyQ2FMWUNIQ0QiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZDQ1My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWU0NDc0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2YxZmU1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhYmZiNC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0NDY5My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHQudGVzdHNfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDg5OWMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhY2I2NS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjExOjA1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZmVmMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBwcm9qZWN0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2IwMzcyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0NDY5My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotKi5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0LnRlc3RzXzEuMC4wLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWRkZTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWNiNjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNThmZTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMGZhNDQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGI3M2YuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhYWVjMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzBiNGJjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOGRmZDcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBQcm9qZWN0Ci0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBQcm9qZWN0IFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzZjkzZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmFiZjcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDEzNzIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRkZDY5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzZTM3Mi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YWJmYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MDFhMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF8xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYjA0Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTNiYmQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhhMzI1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGExODYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2ZiMGUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMTMzZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdCI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MwNTVhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YxOWIxLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE0ZTM4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhNDAyZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMwYTllLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNWYxYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWJlNjYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWIxMjUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlBBIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjYTAzOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU0RLIChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIFByb2plY3QKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNi0wOSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwZjc2Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGRmOTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjZlNDU2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjcuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZmVhdHVyZSIgdmVyc2lvbj0iMS43LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjcuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sYW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUub3JvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC44LnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5qZG9tIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUudmVsb2NpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NzM3Mi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+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+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDE3ZmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMWQ1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ4NTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwZGFkMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1YTA0Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiAyMDA4IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQxN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+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+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ODU0Ny4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzYwZjIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1Yjg0YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMToxNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE0ZGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmE0YzQzLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotIyBUT1JFVklFVyAtIHVwZGF0ZVNpdGVOYW1lCi11cGRhdGVTaXRlTmFtZT1XZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDMzNmIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEpVbml0IFRlc3RzIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjVkM2QuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZV8xLjAuMS4qCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYTc1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjN2Q0Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MDk6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdhYjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNTUzNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQbHVnLWluIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gUHJvamVjdAotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDkgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOWQ1ZjguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MuaXN2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3MzcyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+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+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MDFhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhOWJlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYTA4YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LmluaSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MjFlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA4OWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzAxYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nIj4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2FkZDIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWE1ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmE3ZGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjExOjIyIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJjMjg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjQyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MmJiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRiLnVpCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTY5ODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NDhhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3YzE3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQiBVSQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJiODFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLnVpLndpemFyZC5OZXdKREJDRmlsdGVyZWRDUFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBEVFAgVUkgdG9vbHMKLSAqLwotcHVibGljIGNsYXNzIERUUFVpVG9vbHMgewotCi0JLyoqCi0JICogTGF1bmNoIHRoZSBEVFAgTmV3IENvbm5lY3Rpb24gUHJvZmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhZGRlZCBwcm9maWxlLCBvciBudWxsIGlmIHRoZSB3aXphcmQgd2FzIGNhbmNlbGxlZC4KLQkgKiBUaGUgbmFtZSBjYW4gYmUgdXNlZCB0byBidWlsZCBhIERhbGkgY29ubmVjdGlvbiBwcm9maWxlIGZyb20KLQkgKiBKcHREYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZykuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTmV3Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCS8vIEZpbHRlciBkYXRhc291cmNlIGNhdGVnb3J5Ci0JCU5ld0pEQkNGaWx0ZXJlZENQV2l6YXJkICB3aXphcmQgPSBuZXcgTmV3SkRCQ0ZpbHRlcmVkQ1BXaXphcmQoKTsKLQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCUxvY2FsUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlTdHJpbmcgbmV3Q1BOYW1lID0gbnVsbDsKLQkJaWYgKHdpemFyZERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkvLyBhc3N1bWUgdGhlIGxhc3QgYWRkZWQgcHJvZmlsZSBpcyB0aGUgb25lIHdlIHdhbnQKLQkJCW5ld0NQTmFtZSA9IGxpc3RlbmVyLmFkZGVkUHJvZmlsZS5nZXROYW1lKCk7Ci0JCX0KLQkJUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVQcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXJldHVybiBuZXdDUE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBwcm9maWxlIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgbGlzdGVuZXIgc2ltcGx5IGhvbGRzIG9uIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNvbm5lY3Rpb24KLQkgKiBwcm9maWxlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBMb2NhbFByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9maWxlTGlzdGVuZXIgewotCQlJQ29ubmVjdGlvblByb2ZpbGUgYWRkZWRQcm9maWxlOwotCQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmFkZGVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBwcm9maWxlRGVsZXRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0KLS8vCS8vICoqKioqKioqKiogdmlld2VyIGZpbHRlciAqKioqKioqKioqCi0vLwotLy8Jc3RhdGljIGNsYXNzIExvY2FsVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLS8vCi0vLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX0NBVEVHT1JZX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCUxvY2FsVmlld2VyRmlsdGVyKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCi0vLwkJQE92ZXJyaWRlCi0vLwkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotLy8JCQlDUFdpemFyZE5vZGUgd2l6YXJkTm9kZSA9IChDUFdpemFyZE5vZGUpIGVsZW1lbnQ7Ci0vLwkJCUlQcm9maWxlV2l6YXJkUHJvdmlkZXIgd2l6YXJkUHJvdmlkZXIgPSB3aXphcmROb2RlLmdldFByb3ZpZGVyKCk7Ci0vLwkJCWlmICh3aXphcmRQcm92aWRlciBpbnN0YW5jZW9mIElXaXphcmRDYXRlZ29yeVByb3ZpZGVyKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gQ29ubmVjdGlvblByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvdmlkZXIoCi0vLwkJCQkJCQkoKFByb2ZpbGVXaXphcmRQcm92aWRlcikgd2l6YXJkUHJvdmlkZXIpLmdldFByb2ZpbGUoKSkuZ2V0Q2F0ZWdvcnkoKTsKLS8vCQkJCi0vLwkJCS8vIE9ubHkgZGlzcGxheSB3aXphcmRzIGJlbG9uZyB0byBkYXRhYmFzZSBjYXRlZ29yeQotLy8JCQl3aGlsZSAoY2F0ZWdvcnkgIT0gbnVsbCkgewotLy8JCQkJaWYgKGNhdGVnb3J5LmdldElkKCkuZXF1YWxzKERBVEFCQVNFX0NBVEVHT1JZX0lEKSkgewotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotLy8JCQkJY2F0ZWdvcnkgPSBjYXRlZ29yeS5nZXRQYXJlbnQoKTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjcwZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZmMGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kb2MudXNlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmhlbHA7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE4NGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFib3V0IHRoaXMgY29udGVudDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTExLTE2VDk6NTY6MjNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWJvdXQgdGhpcyBjb250ZW50IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDMuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyOTAiIG5hbWU9InN0aHJlZjI5MCI+PC9hPgotPGgxPkFib3V0IHRoaXMgY29udGVudDwvaDE+Ci08cD5Ob3ZlbWJlciwgMjAwOTwvcD4KLTxhIGlkPSJzdGhyZWYyOTEiIG5hbWU9InN0aHJlZjI5MSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5MaWNlbnNlPC9wPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT4uIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+PC9jb2RlPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNhZjZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NTUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08aDE+QWJvdXQgdGhpcyBjb250ZW50PC9oMT4KLTxwPkphbnVhcnksIDIwMDg8L3A+Ci08YSBpZD0ic3RocmVmMjU4IiBuYW1lPSJzdGhyZWYyNTgiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmM4ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGNoZWF0c2hlZXRzLyxcCi0gICAgICAgICAgICAgICBkY29tbW9uLyxcCi0gICAgICAgICAgICAgICBpbWcvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29uY2VwdF9tYXBwaW5nLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0cy5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAyLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMy5odG0sXAotICAgICAgICAgICAgICAgY29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZC5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAxLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMy5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSxcCi0gICAgICAgICAgICAgICBpbmRleC54bWwsXAotICAgICAgICAgICAgICAgbGVnYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcmVmX2RldGFpbHNfb3JtLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfanBhX2ZhY2V0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfbWFwcGluZ19nZW5lcmFsLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcHJpbWFyeV9rZXkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDguaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwOS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEwLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxOC5odG0sXAotICAgICAgICAgICAgICAgdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0sXAotICAgICAgICAgICAgICAgdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfaW5oZXJpdGFuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfbWFuYWdlX29ybS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfbWFwcGluZy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAxLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDYuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA3Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwOC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDkuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDEwLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTIuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDEzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE2Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTguaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE5Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIyLmh0bSxcCi0gICAgICAgICAgICAgICB0aXBzX2FuZF90cmlja3MuaHRtLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMi5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAzLmh0bSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI4Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyOS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzIuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyNC5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDA0Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0sXAotICAgICAgICAgICAgICAgcmVmX0VudGl0eUNsYXNzUGFnZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfYWRkX2NvbnZlcnRlci5odG0sXAotICAgICAgICAgICAgICAgcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0sXAotICAgICAgICAgICAgICAgcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2phdmFfcGFnZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2pvaW5fY29sdW1ucy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9zZWxlY3RUYWJsZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0sXAotICAgICAgICAgICAgICAgdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0KLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2I5ZDMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCI+Ci0gICA8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cywgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gQmVnaW4mcXVvdDsgYnV0dG9uIGJlbG93LiAKLQotTGV0JmFwb3M7cyBnZXQgc3RhcnRlZCEKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0gdGl0bGU9IlNldHVwIHRoZSBFbnZpcm9ubWVudCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZG9jLnVzZXIvZG9jL2h0bWwvYXNjMTIyOTcwMDM0MzM1Mi5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1UaGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBkaWFsb2cgYXV0b21hdGljYWxseSBhcHBlYXJzIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8Y29tbWFuZCBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuc3FsZWRpdG9yLmF0dGFjaFByb2ZpbGVBY3Rpb24iIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1PbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLCBlbnRlciBhIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24sIHNlbGVjdCB5b3VyIHRhcmdldCBydW50aW1lLCBhbmQgc2VsZWN0IGEgcHJlZGVmaW5lZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24uCi0KLUNsaWNrIDxiPk5leHQ8L2I+IHRvIGRpc3BsYXkgdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkLgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IlNlbGVjdCBQcm9qZWN0IEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgUHJvamVjdCBGYWNldCBwYWdlIHRvIHNlbGVjdCBhIHByZWRlZmluZWQgcHJvamVjdCBjb25maWd1cmF0aW9uIG9yIHNwZWNpZmljIHNwZWNpZmljIGZhY2V0cyB0byBpbmNsdWRlIGluIHRoZSBwcm9qZWN0LiAKLQotQ2xpY2sgJnF1b3Q7TmV4dCZxdW90OyB0byBkaXNwbGF5IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iU3BlY2lmeSB0aGUgSlBBIEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpkdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIEpQQSBGYWNldCBwYWdlIHRvIHNwZWNpZnkgdGhlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtLCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UsIGFuZCB0aGUgc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgYW4gb3JtLnhtbCBmaWxlLgotCi1JZiB5b3UgZG8gbm90IGhhdmUgYW4gYWN0aXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxiPkFkZCBDb25uZWN0aW9uczwvYj4gdG8gY3JlYXRlIG9uZS4gCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSBhIGRlZmluZWQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnksIGNsaWNrIDxiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9iPiBvciA8Yj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L2I+IHRvIGRlZmluZSBvbmUuIAotCi1DbGljayA8Yj5GaW5pc2g8L2I+IHRvIGNvbXBsZXRlIHRoZSB3aXphcmQgYW5kIG9wZW4gdGhlIG9wZW4gdGhlIHByb2plY3QuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gYWRkIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwIHRob3NlIGVudGl0aWVzIHRvIGRhdGFiYXNlIHRhYmxlcy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGU4YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gYWRkIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byB5b3VyIEphdmEgcHJvamVjdC4gCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cyBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0LCBjbGljayB0aGUgPGI+Q2xpY2sgdG8gQmVnaW48L2I+IGJ1dHRvbiBiZWxvdy4gCi1MZXQncyBnZXQgc3RhcnRlZCEKLSAgPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRvIGNyZWF0ZSBhIFBlcnNpc3RlbnQgZW50aXR5LCB5b3UgbXVzdCBjcmVhdGUgYSBKUEEgcHJvamVjdC4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAiQ2xpY2sgdG8gU2tpcCIgYnV0dG9uLgotSWYgbm90LCBzZWxlY3QgPGI+RmlsZS0+TmV3LT5Qcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0+SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiBDb21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgUHJvamVjdCB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLQkJPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSIvPgotCQk8ZGVzY3JpcHRpb24+Ci1XaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgIkNsaWNrIHRvIFNraXAiIGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctPk9wZW4gUGVyc3BlY3RpdmUtPk90aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgIkNsaWNrIHRvIFBlcmZvcm0iIGJ1dHRvbiB0byBoYXZlIHRoZSAiUGVyc2lzdGVuY2UiIHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiPgotCQk8ZGVzY3JpcHRpb24+Ci1UaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzLiBJbiB0aGUgbWFpbiB0b29sYmFyIGFnYWluLCBjbGljayBvbiA8Yj5OZXcgSmF2YSBDbGFzczwvYj4gYnV0dG9uIChvciB0aGUgbGluayBiZWxvdykuCi1UaGUgSmF2YSBlZGl0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gc2hvd2luZyB5b3VyIG5ldyBjbGFzcy4gICAgICAKLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPgotRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICJNYXAgQXMiIGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkZpbmlzaCI+Ci0JCTxkZXNjcmlwdGlvbj4KLUNvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGFkZGVkIGEgSlBBIGVudGl0eSB0byB5b3VyIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gbWFwIHRoZSBlbnRpdHkncyBmaWVsZHMgdG8gZGF0YWJhc2UgdGFibGVzLgotICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyMTkxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9Ik1hcCBhIEphdmEgUGVyc2lzdGVudCBFbnRpdHkiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIG1hcCB0aGUgZmllbGRzIG9mIGEgSlBBIGVudGl0eSBlbnRpdHkgdG8geW91ciBkYXRhYmFzZS4KLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCwgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRvYy51c2VyL2RvYy9odG1sL2FzYzEyMjk3MDAzNDMzNTIuaHRtbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBZb3VyIGVudmlyb25tZW50IG11c3QgYmUgc2V0IHVwIGJlZm9yZSB5b3UgY2FuIHBlcmZvcm0gdGhlIHN0ZXBzIGluIHRoaXMgY2hlYXQgc2hlZXQuIAotCi1DcmVhdGUgYSBkYXRhYmFzZSBwcm9maWxlIGFuZCBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLQotSWYgeW91IGFscmVhZHkgaGF2ZSAoYW5kIGFyZSBjb25uZWN0ZWQgdG8pIGEgZGF0YWJhc2UgY29ubmVjdGlvbiwgeW91ICBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLgotCi1UaGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBkaWFsb2cgYXV0b21hdGljYWxseSBhcHBlYXJzIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8Y29tbWFuZCBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuc3FsZWRpdG9yLmF0dGFjaFByb2ZpbGVBY3Rpb24iIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBOZXcgUHJvamVjdCBXaXphcmQgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotU2VsZWN0IDxiPkZpbGUtJmd0O05ldy0mZ3Q7UHJvamVjdC4uLjwvYj4gYW5kIGNob29zZSA8Yj5KUEEtJmd0O0pQQSBQcm9qZWN0PC9iPiBpbiB0aGUgbGlzdC4gCi0KLUNvbXBsZXRlIGVhY2ggcGFnZSBvZiB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC4KLQotVGhlICZxdW90O05ldyBKUEEgUHJvamVjdCZxdW90OyB3aXphcmQgaXMgYXV0b21hdGljYWxseSBkaXNwbGF5ZWQgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotCi1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgSlBBIHByb2plY3QsIHlvdSAgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5PcGVuUHJvamVjdFdpemFyZEFjdGlvbiIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iT3BlbiB0aGUgSlBBIERldmVsb3BtZW50IFBlcnNwZWN0aXZlIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgV2hlbiB3b3JraW5nIHdpdGggSlBBICBwZXJzaXN0ZW5jZSwgeW91IHNob3VsZCB1c2UgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlLiBJZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZSBhY3RpdmUsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLiAKLUlmIG5vdCwgc2VsZWN0IDxiPldpbmRvdy0mZ3Q7T3BlbiBQZXJzcGVjdGl2ZS0mZ3Q7T3RoZXI8L2I+IGluIHRoZSBtZW51YmFyIGF0IHRoZSB0b3Agb2YgdGhlIHdvcmtiZW5jaC4gSW4gdGhlIFNlbGVjdCBQZXJzcGVjdGl2ZXMgZGlhbG9nLCBzZWxlY3QgPGI+SlBBIERldmVsb3BtZW50PC9iPiBhbmQgY2xpY2sgT0suIFRoaXMgc3RlcCBjaGFuZ2VzIHRoZSBwZXJzcGVjdGl2ZSB0byBzZXQgdXAgdGhlIEVjbGlwc2Ugd29ya2JlbmNoIGZvciBKUEEgZGV2ZWxvcG1lbnQuCi1Zb3UgY2FuIGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbiB0byBoYXZlIHRoZSAmcXVvdDtQZXJzaXN0ZW5jZSZxdW90OyBwZXJzcGVjdGl2ZSBvcGVuZWQgYXV0b21hdGljYWxseS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKYXZhIENsYXNzIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzLiBJbiB0aGUgbWFpbiB0b29sYmFyIGFnYWluLCBjbGljayBvbiA8Yj5OZXcgSmF2YSBDbGFzczwvYj4gYnV0dG9uIChvciB0aGUgbGluayBiZWxvdykuCi1UaGUgSmF2YSBlZGl0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gc2hvd2luZyB5b3VyIG5ldyBjbGFzcy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgUGVyc2lzdGVudCBFbnRpdHkiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIEZpbmFsbHkgd2Ugd2lsbCBtYWtlIHRoZSBKYXZhIGNsYXNzIGEgcGVyc2lzdGVudCBlbnRpdHkuCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3IHNlbGVjdCB0aGUgSmF2YSBjbGFzcy4gCi1JbiB0aGUgSlBBIERldGFpbHMgdmlldywgdXNlIHRoZSAmcXVvdDtNYXAgQXMmcXVvdDsgZmllbGQgdG8gc2VsZWN0IDxiPkVudGl0eTwvYj4uIERhbGkgYXV0b21hdGljYWxseSBhZGRzIHRoZSBARW50aXR5IGFubm90YXRpb24gdG8gdGhlIGNsYXNzIGluIHRoZSBKYXZhIGVkaXRvci4gCi1Vc2UgdGhlIFRhYmxlLCBDYXRhbG9nLCBhbmQgU2NoZW1hIGZpZWxkcyB0byBhc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgc3BlY2lmaWMgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJBZGQgRmllbGRzIHRvIHRoZSBDbGFzcyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBOb3cgeW91IHdpbGwgYWRkIHNvbWUgZmllbGRzIHRvIHRoZSBlbnRpdHkgdG8gbWFwIHRvIHJvd3MgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiAgIAotCi1JZiB5b3VyIHBlcnNpc3RlbnQgZW50aXR5IGFscmVhZHkgaGFzIGZpZWxkcyB0byBtYXAsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLiBJZiBub3QsIHVzZSB0aGUgSmF2YSBlZGl0b3IgdG8gYWRkIGZpZWxkcyB0byB0aGUgZW50aXR5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmRhbGkudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgdGhlIE1hcHBpbmciIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuZGFsaS5kb2MudXNlci9yZWZfZW50aXR5X3BhZ2UuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIE5vdyB5b3UgYXJlIHJlYWR5IHRvIG1hcCB0aGUgZW50aXR5IGZpZWxkcyB0byBjb2x1bW5zIGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCB0aGUgSmF2YSBjbGFzcy4gCi0KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcsIGV4cGFuZCB0aGUgcGVyc2lzdGVudCBlbnRpdHkgdG8gZGlzcGxheSB0aGUgZmllbGRzLiBTZWxlY3QgYSBmaWVsZC4gCi0KLVRoZSBKUEEgRGV0YWlscyB2aWV3IGRpc3BsYXlzIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpZWxkLiBVc2UgdGhlIE1hcCBBcyBmaWVsZCB0byBzZWxlY3QgdGhlIEJhc2ljIG1hcHBpbmcuIFVzZSB0aGUgQ29sdW1uIGZpZWxkIHRvIHNlbGVjdCBhIGNvbHVtbiBmcm9tIHRoZSBkYXRhYmFzZSB0YWJsZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5kYWxpLnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iRmluaXNoIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBtYXBwZWQgdGhlIGZpZWxkcyBmcm9tIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byBhIGNvbHVtbiBpbiBhIGRhdGFiYXNlIHRhYmxlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTIxNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCREpGSSIgbmFtZT0iQkFCQkRKRkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjEiIG5hbWU9InN0aHJlZjIxIj48L2E+PGEgaWQ9InN0aHJlZjIyIiBuYW1lPSJzdGhyZWYyMiI+PC9hPlRoZSBEYWxpIE9SIChvYmplY3QtcmVsYXRpb25hbCkgTWFwcGluZyBUb29sIGFsbG93cyB5b3UgdG8gZGVzY3JpYmUgaG93IHlvdXIgZW50aXR5IG9iamVjdHMgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bWFwPC9zcGFuPiB0byB0aGUgZGF0YSBzb3VyY2UgKG9yIG90aGVyIG9iamVjdHMpLiBUaGlzIGFwcHJvYWNoIGlzb2xhdGVzIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZyb20gdGhlIG9iamVjdCBtb2RlbCZuZGFzaDtkZXZlbG9wZXJzIGFyZSBmcmVlIHRvIGRlc2lnbiB0aGVpciBpZGVhbCBvYmplY3QgbW9kZWwsIGFuZCBEQkFzIGFyZSBmcmVlIHRvIGRlc2lnbiB0aGVpciBpZGVhbCBzY2hlbWEuPC9wPgotPHA+VGhlc2UgbWFwcGluZ3MgdHJhbnNmb3JtIGFuIG9iamVjdCBkYXRhIG1lbWJlciB0eXBlIHRvIGEgY29ycmVzcG9uZGluZyByZWxhdGlvbmFsIGRhdGFiYXNlIGRhdGEgc291cmNlIHJlcHJlc2VudGF0aW9uLiBUaGVzZSBPUiBtYXBwaW5ncyBjYW4gYWxzbyB0cmFuc2Zvcm0gb2JqZWN0IGRhdGEgbWVtYmVycyB0aGF0IHJlZmVyZW5jZSBvdGhlciBkb21haW4gb2JqZWN0cyBzdG9yZWQgaW4gb3RoZXIgdGFibGVzIGluIHRoZSBkYXRhYmFzZSBhbmQgYXJlIHJlbGF0ZWQgdGhyb3VnaCBmb3JlaWduIGtleXMuPC9wPgotPHA+WW91IGNhbiB1c2UgdGhlc2UgbWFwcGluZ3MgdG8gbWFwIHNpbXBsZSBkYXRhIHR5cGVzIGluY2x1ZGluZyBwcmltaXRpdmVzIChzdWNoIGFzIDxjb2RlPmludDwvY29kZT4pLCBKREsgY2xhc3NlcyAoc3VjaCBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+KSwgYW5kIGxhcmdlIG9iamVjdCAoTE9CKSB2YWx1ZXMuIFlvdSBjYW4gYWxzbyB1c2UgdGhlbSB0byB0cmFuc2Zvcm0gb2JqZWN0IGRhdGEgbWVtYmVycyB0aGF0IHJlZmVyZW5jZSBvdGhlciBkb21haW4gb2JqZWN0cyBieSB3YXkgb2YgYXNzb2NpYXRpb24gd2hlcmUgZGF0YSBzb3VyY2UgcmVwcmVzZW50YXRpb25zIHJlcXVpcmUgb2JqZWN0IGlkZW50aXR5IG1haW50ZW5hbmNlIChzdWNoIGFzIHNlcXVlbmNpbmcgYW5kIGJhY2sgcmVmZXJlbmNlcykgYW5kIHBvc3Nlc3MgdmFyaW91cyB0eXBlcyBvZiBtdWx0aXBsaWNpdHkgYW5kIG5hdmlnYWJpbGl0eS4gVGhlIGFwcHJvcHJpYXRlIG1hcHBpbmcgY2xhc3MgaXMgY2hvc2VuIHByaW1hcmlseSBieSB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjMjJjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0FISUMiIG5hbWU9IkJBQkNBSElDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTkiIG5hbWU9InN0aHJlZjE5Ij48L2E+PHNwYW4gY2xhc3M9Iml0YWxpYyI+UGVyc2lzdGVuY2U8L3NwYW4+IHJlZmVycyB0byB0aGUgYWJpbGl0eSB0byBzdG9yZSBvYmplY3RzIGluIGEgZGF0YWJhc2UgYW5kIHVzZSB0aG9zZSBvYmplY3RzIHdpdGggdHJhbnNhY3Rpb25hbCBpbnRlZ3JpdHkuIEluIGEgSjJFRSBhcHBsaWNhdGlvbiwgZGF0YSBpcyB0eXBpY2FsbHkgc3RvcmVkIGFuZCBwZXJzaXN0ZWQgaW4gdGhlIGRhdGEgdGllciwgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWYyMCIgbmFtZT0ic3RocmVmMjAiPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5FbnRpdHkgYmVhbnM8L3NwYW4+IGFyZSBlbnRlcnByaXNlIGJlYW5zIHRoYXQgY29udGFpbiBwZXJzaXN0ZW50IGRhdGEgYW5kIHRoYXQgY2FuIGJlIHNhdmVkIGluIHZhcmlvdXMgcGVyc2lzdGVudCBkYXRhIHN0b3Jlcy4gVGhlIGVudGl0eSBiZWFucyByZXByZXNlbnQgZGF0YSBmcm9tIGEgZGF0YWJhc2U7IGVhY2ggZW50aXR5IGJlYW4gY2FycmllcyBpdHMgb3duIGlkZW50aXR5LiBFbnRpdHkgYmVhbnMgY2FuIGJlIGRlcGxveWVkIHVzaW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmFwcGxpY2F0aW9uLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlPC9zcGFuPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0NzVhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db25jZXB0czwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIENvbmNlcHRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMTgiIG5hbWU9InN0aHJlZjE4Ij48L2E+PC9wPgotPGgxPkNvbmNlcHRzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBhbiBvdmVydmlldyBvZiBjb25jZXB0cyB5b3Ugc2hvdWxkIGJlIGZhbWlsaWFyIHdpdGggd2hlbiB1c2luZyBEYWxpIHRvIGNyZWF0ZSBtYXBwaW5ncyBmb3IgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+SW4gYWRkaXRpb24gdG8gdGhlc2Ugc2VjdGlvbnMsIHlvdSBzaG91bGQgcmV2aWV3IHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkVjbGlwc2UgRGFsaSBwcm9qZWN0OiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaTwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHM8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KU1IgMjIwIEVKQiAzLjAgc3BlY2lmaWNhdGlvbjogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MjIwIj5odHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjA8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FY2xpcHNlTGluayBwcm9qZWN0OiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlMjVjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJHRkpHIiBuYW1lPSJCQUJCR0ZKRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2gxPgotPHA+VGhlIEphdmEgMiBFbnRlcnByaXNlIEVkaXRpb24oSjJFRSkgRW50ZXJwcmlzZSBKYXZhQmVhbnMgKEVKQikgYXJlIGEgY29tcG9uZW50IGFyY2hpdGVjdHVyZSB0aGF0IHlvdSB1c2UgdG8gZGV2ZWxvcCBhbmQgZGVwbG95IG9iamVjdC1vcmllbnRlZCwgZGlzdHJpYnV0ZWQsIGVudGVycHJpc2Utc2NhbGUgYXBwbGljYXRpb25zLiBBbiBhcHBsaWNhdGlvbiB3cml0dGVuIGFjY29yZGluZyB0byB0aGUgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJjaGl0ZWN0dXJlIGlzIHNjYWxhYmxlLCB0cmFuc2FjdGlvbmFsLCBhbmQgc2VjdXJlLjwvcD4KLTxwPlRoZSBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGltcHJvdmVzIHRoZSBFSkIgYXJjaGl0ZWN0dXJlIGJ5IHJlZHVjaW5nIGl0cyBjb21wbGV4aXR5IHRocm91Z2ggdGhlIHVzZSBvZiBtZXRhZGF0YSAoYW5ub3RhdGlvbnMpIGFuZCBzcGVjaWZ5aW5nIHByb2dyYW1tYXRpYyBkZWZhdWx0cyBvZiB0aGF0IG1ldGFkYXRhLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDdlM2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hESEFHSUgiIG5hbWU9IkNIREhBR0lIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjMiIG5hbWU9InN0aHJlZjIzIj48L2E+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPlRoZSBKUEEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGZvciBkZXBsb3ltZW50LiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGF0YWJhc2UgYW5kIGVudGl0eSBtYW5hZ2VyIG9wdGlvbnMsIGFuZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHBlcnNpc3RlbmNlIHVuaXQuIFRvIGVuYWJsZSB5b3UgdG8gZWFzaWx5IGVkaXQgdGhpcyBpbmZvcm1hdGlvbiwgRGFsaSBwcm92aWRlcyB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGlzIGluZm9ybWF0aW9uLiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVG8gd29yayB3aXRoIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzLCBjb21tZW50IG91dCBhbGwgYnV0IG9uZSBwZXJzaXN0ZW5jZSB1bml0IGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTQ0NzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREJJSkFDIiBuYW1lPSJDSERCSUpBQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjI0IiBuYW1lPSJzdGhyZWYyNCI+PC9hPlRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+QWx0aG91Z2ggdGhlIEpQQSBzcGVjaWZpY2F0aW9uIGVtcGhhc2l6ZXMgdGhlIHVzZSBvZiBhbm5vdGF0aW9ucyB0byBzcGVjaWZ5IHBlcnNpc3RlbmNlLCB5b3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRvIHN0b3JlIHRoaXMgbWV0YWRhdGEuIERhbGkgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgc3R1YiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGZvciBhIEpQQSBwcm9qZWN0IHVzaW5nIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi4gU2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgbWV0YWRhdGEgbXVzdCBtYXRjaCB0aGUgWFNEIHNwZWNpZmljYXRpb24gb2YgeW91ciBzZWxlY3RlZCBKUEEgaW1wbGVtZW50YXRpb24uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5EYWxpIHByb3ZpZGVzIGNvbXByZWhlbnNpdmUgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgWE1MIG1hcHBpbmcgZmlsZXMgdGhyb3VnaCB0aGUgPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPiB0aGF0IGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGFubm90YXRpb24tYmFzZWQgY29uZmlndXJhdGlvbiBpbiB0aGUgSmF2YSBzb3VyY2UuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyB1c2UgdGhlIEVjbGlwc2UgWE1MIEVkaXRvciB0byBjcmVhdGUgYW5kIG1haW50YWluIHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb250ZXh0cy54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDBhYjAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2FjY2Vzc1R5cGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBob3cgdGhlIHZhcmlhYmxlIGlzIGFjY2Vzc2VkOiBQcm9wZXJ0eSAoZGVmYXVsdCkgb3IgRmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9uYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBlbnRpdHkgbmFtZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3RhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSB0YWJsZSBhc3NpZ25lZCB0byB0aGlzIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGNsYXNzIG5hbWUgaXMgdXNlZCBhcyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBhIHByb3BlcnR5IG9yIGZpZWxkIHRvIGJlIG92ZXJyaWRkZW4gKGZyb20gdGhlIGRlZmF1bHQgbWFwcGluZ3MpLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IG92ZXJyaWRlcyBhIHByb3BlcnR5IG9yIGZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzSW5zZXJ0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIElOU0VSVCBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzVXBkYXRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgVVBEQVRFIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbWFwQXMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBob3cgdGhpcyBhdHRyaWJ1dGUgbWFwcyB0byB0aGUgZGF0YWJhc2UuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtblRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtbkluc2VydGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBJTlNFUlQgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtblVwZGF0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIFVQREFURSBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZmV0Y2hUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlOiBFYWdlciAoZGVmYXVsdCkgb3IgTGF6eTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfb3B0aW9uYWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZVN0cmF0ZWd5Ij4KLQkJPGRlc2NyaXB0aW9uPkRldGVybWluZXMgaG93IHRoZSBwcmltYXJ5IGtleSBpcyBnZW5lcmF0ZWQ6IEF1dG8gKGRlZmF1bHQpLCBTZXF1ZW5jZSwgSWRlbnRpdHksIG9yIFRhYmxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlVuaXF1ZSBuYW1lIG9mIHRoZSBnZW5lcmF0b3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YXJnZXRFbnRpdHkiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY2FzY2FkZVR5cGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGVudGl0eTogQWxsLCBQZXJzaXN0LCBNZXJnZSwgb3IgTW92ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX21hcHBlZEJ5Ij4KLQkJPGRlc2NyaXB0aW9uPlRoZSBmaWVsZCBpbiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBvd25zIHRoZSByZWxhdGlvbnNoaXAuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luQ29sdW1uTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IHJlZmVyZW5jZSBmb3IgdGhlIGVudGl0eSBhc3NvY2lhdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5SZWZlcmVuY2VkQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGpvaW4gdGFibGUgdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAgbWFwcGluZyBvZiBhbiBlbnRpdHnigJlzIGF0dHJpYnV0ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBpcyBiZWluZyBtYXBwZWQgdG8gdGhlIGVudGl0eeKAmXMgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9tYXBBcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSB0eXBlIG9mIHBlcnNpc3RlbnQgZG9tYWluIG9iamVjdCBmb3IgdGhlIEphdmEgY2xhc3M6IFBlcnNpc3RlbnQsIEVtYmVkZGVkLCBvciBNYXBwZWQgU3VwZXJjbGFzcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlU3RyYXRlZ3kiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBob3cgYW4gZW50aXR5IG1heSBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBlbnRpdGllczogU2luZ2xlIHRhYmxlLCBPbmUgdGFibGUgcGVyIGNsYXNzLCBvciBKb2luZWQgdGFibGVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdoZW4gdXNpbmcgYSBTaW5nbGUgb3IgSm9pbmVkIGluaGVyaXRhbmNlIHN0cmF0ZWd5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGZpZWxkIHRvIHNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIENIQVIgb3IgSU5URUdFUiAoaW5zdGVhZCBvZiBpdHMgZGVmYXVsdDogU3RyaW5nKS4gVGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgbXVzdCBjb25mb3JtIHRvIHRoaXMgdHlwZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVmFsdWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYW4gZW50aXR5IGluIHRoaXMgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBUaGUgdmFsdWUgbXVzdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciB0eXBlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfb3JkZXJCeSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gRW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZU5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgZm9yZWlnbiBrZXkgZm9yIGEgbWFueS10by1tYW55IG9yIGEgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW1hbnkgYXNzb2NpYXRpb24uIFlvdSBjYW4gY29uZmlndXJlIHRoZSBqb2luIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBjYXRhbG9nIG9yIHNjaGVtYSwgY29uZmlndXJlIG9uZSBvciBtb3JlIGpvaW4gdGFibGUgY29sdW1ucyB3aXRoIGEgdW5pcXVlIGNvbnN0cmFpbnQsIGFuZCB1c2UgbXVsdGlwbGUgam9pbiBjb2x1bW5zIHBlciBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5ICB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgY29tcG9zaXRlIHByaW1hcnkga2V5KS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgb3duZWQgKG9yIGludmVyc2Ugc2lkZSkgb2YgdGhlIGFzc29jaWF0aW9uOiB0aGUgb3duZWQgZW50aXR5J3MgcHJpbWFyeSBrZXkgY29sdW1uLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEphdmEgUGVyc2lzdGVuY2Ugb3B0aW9ucyBvbiB0aGUgUHJvcGVydGllcyBwYWdlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VDb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlU2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdXNlZCB0byBtYXAgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZFBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW5jZSBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VPdXRsaW5lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBKUEEgU3RydWN0dXJlIHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZyB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGJhc2VkIG9uIHlvdXIgZGF0YWJhc2UgdGFibGVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfc291cmNlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBwcm9qZWN0IGZvbGRlciBuYW1lIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuIENsaWNrIEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIHBhY2thZ2UgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcywgb3IgY2xpY2sgQnJvd3NlIHRvIHNlbGVjdCBhbiBleGlzdGluZyBwYWNrYWdlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3RhYmxlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbmNlIGVudGl0aWVzIGFuZCB0byBjcmVhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBuZXcgSlBBIHByb2plY3QgbmFtZSwgaXRzIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfZGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZXNlIGZpZWxkcyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBzdG9yZSB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9jbGFzc3BhdGgiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgb3B0aW9uIHRvIGFkZCBsaWJyYXJpZXMgb3IgSkFScyB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byB0aGUgcHJvamVjdOKAmXMgSmF2YSBCdWlsZCBQYXRoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX3BhY2thZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlc2UgZmllbGRzIHRvIGNyZWF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIFNlbGVjdCB0aGUgcGVyc2lzdGVuY2UgdmVyc2lvbiwgdGhlIG5hbWUgb2YgdGhlIEpQQSBwcm92aWRlciwgYW5kIGEgdW5pcXVlIG5hbWUgdG8gaWRlbnRpZnkgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9vcHRpb25zICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB3aGljaCBzY3JpcHQgb3B0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJPcHRpb25zIHBhZ2UgIiBocmVmPSJyZWZfb3B0aW9ucy5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfb2JqZWN0cyAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3Qgd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iT2JqZWN0cyBwYWdlICIgaHJlZj0icmVmX29iamVjdHMuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX3NhdmUgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBzY3JpcHQuIFlvdSBjYW4gYWxzbyBwcmV2aWV3IHRoZSBzY3JpcHQgYW5kIHNwZWNpZnkgdG8gcnVuIG9yIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHNjcmlwdCBhZnRlciBnZW5lcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJTYXZlIGFuZCBSdW4gRERMIHBhZ2UgIiBocmVmPSJyZWZfc2F2ZV9hbmRfcnVuLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9zdW1tYXJ5ICI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2Ugc2hvd3MgdGhlIHNldHRpbmdzIHRoYXQgeW91IHNlbGVjdGVkIGZvciB0aGUgZ2VuZXJhdGVkIERETC4gVG8gY2hhbmdlIGFueSBvcHRpb24gY2xpY2sgIkJhY2siIG9yIGNsaWNrICJGaW5pc2giIHRvIGNvbnRpbnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZSBzZXF1ZW5jZSBnZW5lcmF0b3IuIFRoaXMgbmFtZSBpcyBnbG9iYWwgdG8gdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKGFjcm9zcyBhbGwgZ2VuZXJhdG9yIHR5cGVzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JUYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiBvZiB0aGUgZ2VuZXJhdG9yIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclZhbHVlQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIGZvciB0aGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW5WYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIG9mIHRoZSBnZW5lcmF0b3IgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSBwcmltYXJ5IGtleSB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19kYXRhYmFzZUF1dGhvcml6YXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRvIGNvbm5lY3QgKGxvZyBpbikgdG8gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHlvdXIgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiAKLQkJWW91IG11c3QgaGF2ZSBhIGRlZmluZWQgZGF0YWJhc2UgY29ubmVjdGlvbiAoYW5kIGJlIGNvbm5lY3RlZCkgdG8gYWRkIHBlcnNpc3RlbmNlLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBwZXJzaXN0ZW5jZSB0byBhIEphdmEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2VfcHJvamVjdC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGVtcG9yYWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgbWFwcGVkIGZpZWxkIGNvbnRhaW5zIGEgRGF0ZSAoamF2YS5zcWwuRGF0ZSksIFRpbWUgKGphdmEuc3FsLlRpbWUpLCBvciBUaW1lc3RhbXAgKGphdmEuc3FsLlRpbWVzdGFtcCkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPkRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byB1c2UgYSBzcGVjaWZpYyBkYXRhYmFzZSB0YWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvciI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIHVzZSBhIHNwZWNpZmljIHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBzZXF1ZW5jZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbG9iIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byBqYXZhLnNxbC5DbG9iIG9yIGphdmEuc3FsLkJsb2IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW51bWVyYXRlZCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIFN0cmluZyB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYXRhbG9nIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIEphdmEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIHRvIHdoaWNoIHRoZSBvcm0ueG1sIGZpbGUgYXBwbGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fY2F0YWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0byB1c2UgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoaXMgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2FjY2VzcyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBhY2Nlc3MgbWV0aG9kIGZvciB2YXJpYWJsZXMgaW4gdGhpcyBwcm9qZWN0OiBQcm9wZXJ0eSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2Nhc2NhZGUiPgotCQk8ZGVzY3JpcHRpb24+QWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV94bWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX0pQQVBsYXRmb3JtIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgaW1wbGVtZW50YXRpb24uRGVmYXVsdCBpcyBHZW5lcmljLi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZU9STSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYW4gaW5pdGlhbCBvcm0ueG1sIGZpbGUuIFVzZSB0aGlzIGZpbGUgdG8gc3BlY2lmeSBwcm9qZWN0IGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgZGVmYXVsdCBjYWNoaW5nIHN0cmF0ZWd5IGZvciB0aGUgcHJvamVjdC4gVGhlIGRlZmF1bHQgaXMgV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY2FjaGluZ19kZWZhdWx0U2l6ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgY2FjaGUuIFRoZSBkZWZhdWx0IGlzIDEwMCBpdGVtcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRTaGFyZWQiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfbGV2ZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsLiBEZWZhdWx0IGlzIEluZm8gbGV2ZWwuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aW1lU3RhbXAiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIHRoZSB0aW1lc3RhbXAgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aHJlYWQiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIGEgdGhyZWFkIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19zZXNzaW9uIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciBhbiBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19leGNlcHRpb25zIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuLiBEZWZhdWx0IGlzIEZhbHNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfc2Vzc2lvbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc19zZXNzaW9uc1htbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc190YXJnZXRTZXJ2ZXIiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0SmF2YSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gaW5jbHVkZSBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyBpbiB0aGlzIHByb2plY3QuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKYXZhIHBhZ2UiIGhyZWY9InJlZl9qYXZhX3BhZ2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdEZhY2V0Ij4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlDbGFzc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgcGFja2FnZSwgY2xhc3MgbmFtZSwgYW5kIGluaGVyaXRhbmNlIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSB0byBjcmVhdGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJFbnRpdHkgQ2xhc3MgcGFnZSIgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBFbnRpdHkgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgZW50aXR5IiBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlQcm9wZXJ0aWVzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgZW50aXR5IG5hbWUsIGFzc29jaWF0ZWQgdGFibGUsIGFuZCBtYXBwZWQgZmllbGRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIEVudGl0eSB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBlbnRpdHkiIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX3NlbGVjdFRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IFRhYmxlcyBwYWdlIiBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ190YWJsZUFzc29jaWF0aW9uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkYXRhYmFzZSB0YWJsZSBhbmQgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iVGFibGUgQXNzb2NpYXRpb25zIHBhZ2UiIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHRhYmxlIG1hcHBpbmcgYW5kIGRvbWFpbiBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiBwYWdlIiBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2N1c3RvbWl6ZUluZGl2aWR1YWxFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdGFibGUgbWFwcGluZyBhbmQgZG9tYWluIGNsYXNzIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIHBhZ2UiIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hc3NvY2lhdGlvblRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBmb3IgYW4gZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIHBhZ2UiIGhyZWY9InJlZl9hc3NvY2lhdGlvbl90YWJsZXMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19qb2luQ29sdW1uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucyBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpvaW4gQ29sdW1ucyBwYWdlIiBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfYXNzb2NpYXRpb25DYXJkaW5hbGl0eVBhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgY2FyZGluYWxpdHkgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSBwYWdlIiBocmVmPSJyZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19zZWxlY3RDYXNjYWRlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBhc3NvY2lhdGlvbjogQWxsLCBQZXJzaXN0LCBNZXJnZSwgUmVtb3ZlLCBvciBSZWZyZXNoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IENhc2NhZGUgcGFnZSIgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfZ2VuZXJhbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBnZW5lcmFsIHBlcnNpc3RlbmNlIG9wdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29ubmVjdGlvbiBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY29ubmVjdGlvbiIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfY3VzdG9taXphdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemF0aW9uIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9jb25uZWN0aW9uIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jYWNoaW5nIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY2FjaGluZyBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ2FjaGluZyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY2FjaGluZyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfbG9nZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIGxvZ2dpbmcgcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkxvZ2dpbmcgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2xvZ2dpbmciIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX29wdGlvbnMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGFuZCBtaXNjZWxsYW5vdXMgb3B0aW9ucy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik9wdGlvbnMgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX29wdGlvbnMiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2NoZW1hIEdlbmVyYXRpb24gcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3Byb3BlcnRpZXMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvcGVydGllcyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcGVydGllcyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQkJPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NvdXJjZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9wZXJ0aWVzIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wZXJ0aWVzIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIHBhZ2UiIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZV9uZXdfY29udmVydGVycyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIGEgbmV3IEVjbGlwc2VMaW5rIGNvbnZldGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIGhyZWY9InJlZl9hZGRfY29udmVydGVyIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybSIgLz4KLQk8L2NvbnRleHQ+Ci0KLTwhLS0gQWRkZWQgZm9yIDMuMCAtLT4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19jYW5vbmljYWxNZXRhbW9kZWwiPgotCQk8ZGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY2MTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUBpbXBvcnQgIi4uLy4uLy4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotc3Bhbi5jb250cm9sLCBzcGFuLmd1aS1vYmplY3QtYWN0aW9uLCBwLnN1YmhlYWQyLCBzcGFuLmJvbGQsIHAubm90ZXAxIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ubmFtZSwgcC50aXRsZWluZmlndXJlLCBzcGFuLml0YWxpYyB7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotcC50aXRsZWluZmlndXJlLCBwLnN1YmhlYWQyIHsKLSAgcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXNwYW4uY29weXJpZ2h0bG9nbyB7Zm9udC1zaXplOiAwLjhlbX0KLQotLmZvb3RlciB7bWFyZ2luLXRvcDogMmVtO2JvcmRlci10b3A6MXB4IHNvbGlkICNjY2NjY2M7cGFkZGluZy10b3A6MWVtO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlYzQ5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaHJlZj0iLi4vLi4vbGVnYWwuaHRtIj5MaWNlbnNlIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2VkNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdldHRpbmcgc3RhcnRlZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIEdldHRpbmcgc3RhcnRlZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjIiIG5hbWU9InN0aHJlZjIiPjwvYT48L3A+Ci08aDE+R2V0dGluZyBzdGFydGVkPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBUb29scy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI0JBQkVGSENEIj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNCQUJJR0NKQSI+RGFsaSBxdWljayBzdGFydDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlzaXQgdGhlIERhbGkgaG9tZSBwYWdlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9tYWluLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpL21haW4ucGhwPC9hPjwvY29kZT4uPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NjIxOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkVGSENEIiBuYW1lPSJCQUJFRkhDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248YSBpZD0ic3RocmVmMyIgbmFtZT0ic3RocmVmMyI+PC9hPjxhIGlkPSJzdGhyZWY0IiBuYW1lPSJzdGhyZWY0Ij48L2E+PC9oMT4KLTxwPkJlZm9yZSBpbnN0YWxsaW5nIERhbGksIGVuc3VyZSB0aGF0IHlvdXIgZW52aXJvbm1lbnQgbWVldHMgdGhlIGZvbGxvd2luZyA8c3BhbiBjbGFzcz0iaXRhbGljIj5taW5pbXVtPC9zcGFuPiByZXF1aXJlbWVudHM6PC9wPgotPHVsPgotPGxpPgotPHA+RWNsaXBzZSAzLjUgKDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2FkczwvYT48L2NvZGU+KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgKEpSRSkgMS41ICg8Y29kZT48YSBocmVmPSJodHRwOi8vamF2YS5jb20iPmh0dHA6Ly9qYXZhLmNvbTwvYT48L2NvZGU+KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSAzLjEgKDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHM8L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgZm9yIEphdmEgRUUgNS4gRm9yIGV4YW1wbGUsIHRoZSBFY2xpcHNlTGluayBpbXBsZW1lbnRhdGlvbiBmb3IgSlBBIGNhbiBiZSBvYnRhaW5lZCBmcm9tOiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay88L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+UmVmZXIgdG8gPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpL2dldHRpbmdzdGFydGVkX21haW4uaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpL2dldHRpbmdzdGFydGVkX21haW4uaHRtbDwvYT48L2NvZGU+IGZvciBhZGRpdGlvbmFsIGluc3RhbGxhdGlvbiBpbmZvcm1hdGlvbi48L3A+Ci08cD48YSBpZD0ic3RocmVmNSIgbmFtZT0ic3RocmVmNSI+PC9hPkRhbGkgaXMgaW5jbHVkZWQgYXMgcGFydCBvZiBXVFAgMy4xLiBObyBhZGRpdGlvbmFsIGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkLjwvcD4KLTxhIGlkPSJzdGhyZWY2IiBuYW1lPSJzdGhyZWY2Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkFjY2Vzc2liaWxpdHkgRmVhdHVyZXM8L3A+Ci08cD5EYWxpIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzIGluIEVjbGlwc2UsIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5hdmlnYXRpbmcgdGhlIHVzZXIgaW50ZXJmYWNlIHVzaW5nIHRoZSBrZXlib2FyZC48L3A+Ci08L2xpPgotPGxpPgotPHA+U3BlY2lmeWluZyBnZW5lcmFsIGFjY2Vzc2liaWxpdHkgcHJlZmVyZW5jZXMgZm9yIHRoZSBlZGl0b3IuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5TZWUgPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvYWNjZXNzaWJpbGl0eS9hY2Nlc3NtYWluLmh0bSI+QWNjZXNzaWJpbGl0eSBGZWF0dXJlcyBpbiBFY2xpcHNlPC9hPiBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+V29ya2JlbmNoIFVzZXIgR3VpZGU8L3NwYW4+IGZvciBkZXRhaWxzLjwvcD4KLTxhIGlkPSJzdGhyZWY3IiBuYW1lPSJzdGhyZWY3Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkhlbHAgQWNjZXNzaWJpbGl0eTwvcD4KLTxwPlRoZSBkb2N1bWVudGF0aW9uIGFuZCBoZWxwIGNvbnRhaW5zIG1hcmt1cCB0byBmYWNpbGl0YXRlIGFjY2VzcyBieSB0aGUgZGlzYWJsZWQgY29tbXVuaXR5LiBTZWUgPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvdGFza3MvaGVscF9hY2Nlc3NpYmlsaXR5Lmh0bSI+SGVscCBBY2Nlc3NpYmlsaXR5PC9hPiBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+V29ya2JlbmNoIFVzZXIgR3VpZGU8L3NwYW4+IGZvciBkZXRhaWxzLjwvcD4KLTxwPldoZW4gdXNpbmcgdGhlIGhlbHAsIGJlIGF3YXJlIG9mIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+U2NyZWVuIHJlYWRlcnMgbWF5IG5vdCBhbHdheXMgY29ycmVjdGx5IHJlYWQgdGhlIGNvZGUgZXhhbXBsZXMgaW4gdGhpcyBkb2N1bWVudC4gVGhlIGNvbnZlbnRpb25zIGZvciB3cml0aW5nIGNvZGUgcmVxdWlyZSB0aGF0IGNsb3NpbmcgYnJhY2VzIHNob3VsZCBhcHBlYXIgb24gYW4gb3RoZXJ3aXNlIGVtcHR5IGxpbmU7IGhvd2V2ZXIsIHNvbWUgc2NyZWVuIHJlYWRlcnMgbWF5IG5vdCBhbHdheXMgcmVhZCBhIGxpbmUgb2YgdGV4dCB0aGF0IGNvbnNpc3RzIHNvbGVseSBvZiBhIGJyYWNrZXQgb3IgYnJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRoaXMgZG9jdW1lbnRhdGlvbiBtYXkgY29udGFpbiBsaW5rcyB0byBXZWIgc2l0ZXMgb2Ygb3RoZXIgY29tcGFuaWVzIG9yIG9yZ2FuaXphdGlvbnMgdGhhdCB3ZSBkbyBub3QgY29udHJvbC4gV2UgbmVpdGhlciBldmFsdWF0ZSBub3IgbWFrZSBhbnkgcmVwcmVzZW50YXRpb25zIHJlZ2FyZGluZyB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGVzZSBXZWIgc2l0ZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ5Nzk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EYWxpIHF1aWNrIHN0YXJ0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJEYWxpIHF1aWNrIHN0YXJ0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUdDSkEiIG5hbWU9IkJBQklHQ0pBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5EYWxpIHF1aWNrIHN0YXJ0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4IiBuYW1lPSJzdGhyZWY4Ij48L2E+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIHRvIGhlbHAgeW91IHF1aWNrbHkgc3RhcnQgdXNpbmcgRGFsaSB0byBjcmVhdGUgcmVsYXRpb25hbCBtYXBwaW5ncyBiZXR3ZWVuIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgZGF0YWJhc2UgdGFibGVzLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jQkFCREZIREEiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIj5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtI0NIREhHSEJGIj5UaXBzIGFuZCB0cmlja3M8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5YWEwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRGSERBIiBuYW1lPSJCQUJERkhEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkiIG5hbWU9InN0aHJlZjkiPjwvYT5UaGlzIHF1aWNrIHN0YXJ0IHNob3dzIGhvdyB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuPC9wPgotPG9sPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNlbGVjdCBGaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgUHJvamVjdDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciBhIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJvamVjdCBuYW1lPC9zcGFuPiAoc3VjaCBhcyA8Y29kZT5RdWlja1N0YXJ0PC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFyZ2V0IFJ1bnRpbWU8L3NwYW4+IChzdWNoIGFzIDxjb2RlPkFwYWNoZSBUb21jYXQ8L2NvZGU+KSBhbmQgY29uZmlndXJhdGlvbiwgc3VjaCBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+VXRpbGl0eSBKUEEgUHJvamVjdCB3aXRoIEphdmEgNS4wPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBKYXZhIHNvdXJjZSBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPklmIHlvdSBoYXZlIGV4aXN0aW5nIEphdmEgc291cmNlIGZpbGVzLCBhZGQgdGhlbSB0byB5b3VyIGNsYXNzcGF0aCBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSBKUEEgRmFjZXQgZGlhbG9nLCBzZWxlY3QgeW91ciB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtIChvciBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+KSwgZGF0YWJhc2UgY29ubmVjdGlvbiAob3IgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24pLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSAoc3VjaCBhcyBFY2xpcHNlTGluayksIGRlZmluZSBob3cgRGFsaSBzaG91bGQgbWFuYWdlIHBlcnNpc3RlbnQgY2xhc3NlcywgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb248L3NwYW4+IGlmIHlvdSByZXF1aXJlIGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IERhbGkgZGVyaXZlcyBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBtYXkgYmUgaW5jb3JyZWN0IGluIHNvbWUgY2FzZXMuIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgcHJvamVjdCB0byB0aGUgd29ya2JlbmNoIGFuZCBvcGVucyB0aGUgSlBBIHBlcnNwZWN0aXZlLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwIiBuYW1lPSJzdGhyZWYxMCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBQcm9qZWN0IGluIFByb2plY3QgRXhwbG9yZXI8L3A+Ci08aW1nIHNyYz0iaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmciIGFsdD0iUGFja2FnZSBFeHBsb3JlciBzaG93aW5nIHRoZSBKUEEgcHJvamVjdC4iIHRpdGxlPSJQYWNrYWdlIEV4cGxvcmVyIHNob3dpbmcgdGhlIEpQQSBwcm9qZWN0LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Ob3cgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGEgcHJvamVjdCB3aXRoIHBlcnNpc3RlbmNlLCB5b3UgY2FuIGNvbnRpbnVlIHdpdGggPGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMmNiNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGR0RERyIgbmFtZT0iQkFCRkdEREciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMSIgbmFtZT0ic3RocmVmMTEiPjwvYT5UaGlzIHF1aWNrIHN0YXJ0IHNob3dzIGhvdyB0byBjcmVhdGUgYSBuZXcgcGVyc2lzdGVudCBKYXZhIGVudGl0eS4gV2Ugd2lsbCBjcmVhdGUgYW4gZW50aXR5IHRvIGFzc29jaWF0ZSB3aXRoIGEgZGF0YWJhc2UgdGFibGUuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBhZGQgdGhlIEFERFJFU1MgdGFibGUgdG8geW91ciBkYXRhYmFzZS48L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3JlciBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3ICZndDsgT3RoZXI8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSAmZ3Q7IEVudGl0eTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgcGFja2FnZSBuYW1lIChzdWNoIGFzIDxjb2RlPnF1aWNrc3RhcnQuZGVtby5tb2RlbDwvY29kZT4pLCB0aGUgY2xhc3MgbmFtZSAoc3VjaCBhcyA8Y29kZT5BZGRyZXNzPC9jb2RlPikgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT4gYXBwZWFycywgd2hpY2ggZW5hYmxlcyB5b3UgdG8gZGVmaW5lIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZHMsIHdoaWNoIHlvdSB3aWxsIG1hcCB0byB0aGUgY29sdW1ucyBvZiBhIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBpZD0ic3RocmVmMTIiIG5hbWU9InN0aHJlZjEyIj48L2E+PGEgaWQ9InN0aHJlZjEzIiBuYW1lPSJzdGhyZWYxMyI+PC9hPlVzZSB0aGUgRW50aXR5IEZpZWxkcyBkaWFsb2cgKGludm9rZWQgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4pIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhlIEFkZHJlc3MgY2xhc3M6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotcHJpdmF0ZSBMb25nIGlkOwotcHJpdmF0ZSBTdHJpbmcgY2l0eTsKLXByaXZhdGUgU3RyaW5nIGNvdW50cnk7Ci1wcml2YXRlIFN0cmluZyBzdGF0ZU9yUHJvdmluY2U7Ci1wcml2YXRlIFN0cmluZyBwb3N0YWxDb2RlOwotcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OwotPC9wcmU+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVlvdSB3aWxsIGFsc28gbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBjb2x1bW5zIHRvIHRoZSBBRERSRVNTIGRhdGFiYXNlIHRhYmxlOgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotTlVNQkVSKDEwLDApIEFERFJFU1NfSUQgKHByaW1hcnkga2V5KQotVkFSQ0hBUjIoODApIFBST1ZJTkNFCi1WQVJDSEFSMig4MCkgQ09VTlRSWQotVkFSQ0hBUjIoMjApIFBfQ09ERQotVkFSQ0hBUjIoODApIFNUUkVFVAotVkFSQ0hBUjIoODApIENJVFkKLTwvcHJlPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotPC9wcmU+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFdpdGggdGhlIENyZWF0ZSBKUEEgRW50aXR5IGNvbXBsZXRlZCwgRWNsaXBzZSBkaXNwbGF5cyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZHJlc3M8L3NwYW4+IGVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTxwPkFkZHJlc3MuamF2YSBpbmNsdWRlcyB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gYW5ub3RhdGlvbiwgdGhlIHBlcnNpc3RlbmNlIGZpZWxkcywgYXMgd2VsbCBhcyA8Y29kZT5nZXR0ZXI8L2NvZGU+IGFuZCA8Y29kZT5zZXR0ZXI8L2NvZGU+IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE0IiBuYW1lPSJzdGhyZWYxNCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkFkZHJlc3MgRW50aXR5IGluIEFkZHJlc3MuamF2YTwvcD4KLTxpbWcgc3JjPSJpbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmciIGFsdD0iSmF2YSBlZGl0b3Igd2l0aCB0aGUgQWRkcmVzcyBlbnRpdHkuIiB0aXRsZT0iSmF2YSBlZGl0b3Igd2l0aCB0aGUgQWRkcmVzcyBlbnRpdHkuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkVjbGlwc2UgYWxzbyBkaXNwbGF5cyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZHJlc3M8L3NwYW4+IGVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3OjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE1IiBuYW1lPSJzdGhyZWYxNSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkFkZHJlc3MgRW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXc8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nIiBhbHQ9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3LiIgdGl0bGU9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+QWRkcmVzczwvc3Bhbj4gY2xhc3MgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgbm90aWNlIHRoYXQgRGFsaSBoYXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHRoZSBBRERSRVNTIGRhdGFiYXNlIHRhYmxlIHdpdGggdGhlIGVudGl0eSBiZWNhdXNlIHRoZXkgYXJlIG5hbWVkIGlkZW50aWNhbGx5LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotRGVwZW5kaW5nIG9uIHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiB0eXBlLCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNiIgbmFtZT0ic3RocmVmMTYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRGV0YWlscyBWaWV3IGZvciBBZGRyZXNzIEVudGl0eTwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZyIgYWx0PSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1BZnRlciBhc3NvY2lhdGluZyB0aGUgZW50aXR5IHdpdGggdGhlIGRhdGFiYXNlIHRhYmxlLCB5b3Ugc2hvdWxkIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIGluY2x1ZGUgdGhpcyBKUEEgZW50aXR5LgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzPC9zcGFuPi4gRGFsaSBhZGRzIHRoZSBmb2xsb3dpbmcgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08cD48Y29kZT4mbHQ7Y2xhc3MmZ3Q7cXVpY2tzdGFydC5kZW1vLm1vZGVsLkFkZHJlc3MmbHQ7L2NsYXNzJmd0OzwvY29kZT48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08cD5Ob3cgd2UgYXJlIHJlYWR5IHRvIG1hcCBlYWNoIGZpZWxkcyBpbiB0aGUgQWRkcmVzcyBjbGFzcyB0byBhIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2UgdGFibGUuPC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPmlkPC9zcGFuPiBmaWVsZCBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQgY2xpY2sgaWQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBpZDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFERFJFU1NfSUQ8L3NwYW4+IGluIHRoZSBOYW1lIGZpZWxkOjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE3IiBuYW1lPSJzdGhyZWYxNyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIFZpZXcgZm9yIHRoZSBhZGRyZXNzSWQgRmllbGQ8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZyIgYWx0PSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgdGhlIEFkZHJlc3MgZW50aXR5JnJzcXVvO3MgaWQgYXR0cmlidXRlLiIgdGl0bGU9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciB0aGUgQWRkcmVzcyBlbnRpdHkmcnNxdW87cyBpZCBhdHRyaWJ1dGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBBZGRyZXNzIGVudGl0eTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASWQKLUBDb2x1bW4obmFtZT0iQUREUkVTU19JRCIpCi08L3ByZT48L2xpPgotPGxpPgotPHA+TWFwIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKGFzIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYzwvc3Bhbj4gbWFwcGluZ3MpIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhYmFzZSBjb2x1bW46PC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgbWFwcGluZ3MgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcyBpbiB0aGUgQWRkcmVzcyBlbnRpdHkuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgbWFwcGluZ3MgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcyBpbiB0aGUgQWRkcmVzcyBlbnRpdHkuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzMyUiIC8+Ci08Y29sIHdpZHRoPSIzMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5GaWVsZDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+TWFwIEFzPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ4Ij5EYXRhYmFzZSBDb2x1bW48L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPmNpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMzLXQ4Ij5DSVRZPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPmNvdW50cnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMzLXQ4Ij5DT1VOVFJZPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnBvc3RhbENvZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OCByMWMzLXQ4Ij5QX0NPREU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+cHJvdmluY2VPclN0YXRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMy10OCI+UFJPVklOQ0U8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10OCIgaGVhZGVycz0icjFjMS10OCI+c3RyZWV0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMy10OCI+U1RSRUVUPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5EYWxpIGF1dG9tYXRpY2FsbHkgbWFwcyBzb21lIGZpZWxkcyB0byB0aGUgY29ycmVjdCBkYXRhYmFzZSBjb2x1bW4gKHN1Y2ggYXMgdGhlIGNpdHkgZmllbGQgdG8gdGhlIENpdHkgY29sdW1uKSBpZiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2YwMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmNDBjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWY1MWE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjBlMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3OTdhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2RlZmF1bHRfZW50aXR5X2dlbmVyYXRpb24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Njc2MTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2luZGl2aWR1YWxfZW50aXRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzdiZGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2luZGl2aWR1YWxfZW50aXRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjMwMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0OTY0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFhMjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTM3NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNjg3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2NDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZGQ5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0Mjg5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDU1MGVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwZWRfZW50aXR5X3R5cGVfbGluay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjE2MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwZWRfZW50aXR5X3R5cGVfbGluay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1NTc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VtYmVkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NmVhNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VtYmVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDRmZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGU4ZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tb2RpZnlfZmFjZXRlZF9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Yzc5NjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tb2RpZnlfZmFjZXRlZF9wcm9qZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI5NGVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlOWRjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNTJiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWZiNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MDIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjYzE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGVhMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTdjZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGRjOTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDliYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDQ4OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzM3MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDc4MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0MjVhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDc5YzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsYy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzgxYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJjNzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWx0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWx0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZjIxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWFhODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzU1N2VlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjYTA1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlY29uZGFyeV90YWJsZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxZjlmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlY29uZGFyeV90YWJsZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWJlOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMzUwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljOWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfdGFibGVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X3RhYmxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1N2M5MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfdGFibGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU5ZjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YjQwYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9lbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWExZGJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGJlYWNlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjdkMTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08aW5kZXggdmVyc2lvbj0iMS4wIj4KLTxlbnRyeSBrZXl3b3JkPSJAQmFzaWMsIEJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTE1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQENvbHVtbiwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzMCIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JDb2x1bW4iPgotPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTUiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jc3RocmVmMjI0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARGlzY3JpbWluYXRvclZhbHVlIj4KLTxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIyMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRhYmxlLCBFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjgwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkLCBFbWJlZGRlZCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTAuaHRtI3N0aHJlZjExOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZElkLCBFbWJlZGRlZCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI3N0aHJlZjEyMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBFbnRpdHksIEVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY3MyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBFbnVtZXJhdGVkLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQEdlbmVyYXRlZFZhbHVlLCBQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNDkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJASWQsIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQEluaGVyaXRhbmNlLCBTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjkzIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASm9pbkNvbHVtbiI+Ci08ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQ4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jc3RocmVmMjQ1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYyNDgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJATG9iLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjM1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQE1hbnlUb01hbnksIE1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEzMSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9PbmUsIE1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTM2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQE1hcHBlZFN1cGVyY2xhc3MsIE1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjg3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQE5hbWVkUXVlcnksIENyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmMTA3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQE9uZVRvTWFueSwgT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxNDEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJAT25lVG9PbmUsIE9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxNDUiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJAT3JkZXJCeSwgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0MyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkBTZXF1ZW5jZUdlbmVyYXRvciwgUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjUxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQFRlbXBvcmFsLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjM3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQFRyYW5zaWVudCwgVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTUxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQFZlcnNpb24sIFZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTUiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhcmNoaXRlY3R1cmUgb2YgRGFsaSBmZWF0dXJlLCBEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDMyLmh0bSNzdGhyZWYyODMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhc3NvY2lhdGlvbiB0YWJsZXMsIENyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI3N0aHJlZjIwNiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBvdmVycmlkZXMsIEF0dHJpYnV0ZSBvdmVycmlkZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI3N0aHJlZjIxMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkF0dHJpYnV0ZSBPdmVycmlkZXMgLSBpbiBKYXZhIERldGFpbHMgdmlldywgQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjE1IiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzIj4KLTxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3LCBKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjIyOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcsIFVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiPjx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI3N0aHJlZjIxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJiYXNpYyBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJAQmFzaWMsIEJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTE2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIEJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTE0IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IihTZWUgYWxzbyBtYXBwaW5ncykiPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iY2FjaGluZywgQ2FjaGluZyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jc3RocmVmMjYyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iY2FyZGluYWxpdHkgLSBhc3NvY2lhdGlvbiB0YWJsZXMsIEFzc29jaWF0aW9uIENhcmRpbmFsaXR5Ij48dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSNzdGhyZWYyMDkiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMiPgotPGVudHJ5IGtleXdvcmQ9ImFkZGluZyBwZXJzaXN0ZW5jZSB0bywgQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNjgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlLCBFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjc5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZW50aXR5LCBFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNzEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYW5hZ2VkLCBNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyBwZXJzaXN0ZW50IGNsYXNzZXMsIEpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMTkyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MsIE1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjg1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZywgU3luY2hyb25pemluZyBjbGFzc2VzIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjUzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb2x1bW5zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZGlzY3JpbWluYXRvciI+Ci08ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5NiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMjUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJqb2luIj4KLTxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxNDciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNzdGhyZWYyNDQiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjI0NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFwcGluZyB0bywgR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzMSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWx1ZSI+Ci08ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5OCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImNvbm5lY3Rpb24gcG9vbCwgTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjUyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iY29udmVydGluZyBKYXZhIHByb2plY3QgdG8gSlBBLCBDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgYSBKUEEgUHJvamVjdCBXaXphcmQsIENyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQsIENyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj48dG9waWMgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI3N0aHJlZjE4OSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgdGFibGVzIj4KLTxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGVudGl0aWVzIGZyb20sIEdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTYwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSAtIHBlcnNpc3RlbmNlIj4KLTxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3NSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InNjaGVtYSwgUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyNzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiAtIERhbGksIERhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI3N0aHJlZjI4MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVhZ2VyIGZldGNoLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjMzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZSwgTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjUxIiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIGNsYXNzIj4KLTxlbnRyeSBrZXl3b3JkPSJARW1iZWRkYWJsZSwgRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY4MSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjc4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWRJZCwgRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjQiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIG1hcHBpbmciPgotPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZCwgRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMjAiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLTxlbnRyeSBrZXl3b3JkPSJARW50aXR5IGFubm90YXRpb24sIEVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY3NCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYyMCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nLCBDcmVhdGluZyBhIEpQQSBFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImN1c3RvbWl6aW5nLCBDdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcyI+PHRvcGljIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jc3RocmVmMjA1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZW1iZWRkYWJsZSwgRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY4MiIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIHRhYmxlcyI+Ci08ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxNTciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjAxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nLCBDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiI+PHRvcGljIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jc3RocmVmMjA0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldywgSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjIxMiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im1hcHBlZCBzdXBlcmNsYXNzLCBNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4OCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcsIENyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNzdGhyZWYxMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlLCBDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTEiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCI+Ci08ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjY5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjc1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkgdGFibGVzLCBTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIxOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlLCBTZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgUHJvcGVydGllcyBwYWdlLCAmbHQ7YSBpZD0mcXVvdDtzdGhyZWY0MyZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjQzJnF1b3Q7Jmd0OyZsdDsvYSZndDtUaGUgRW50aXR5IENsYXNzIFBhZ2UiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0NSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW51bWVyYXRlZCI+Ci08ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIzOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVycm9yIG1lc3NhZ2VzIC0gRGFsaSI+Ci08ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE2NiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkVycm9yIG1lc3NhZ2VzIj48dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI3N0aHJlZjE3MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImV4dGVuc2lvbiBwb2ludHMgLSBEYWxpIGZlYXR1cmUsIERhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI3N0aHJlZjI4NCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImZldGNoIHR5cGUsIEdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMzIiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+Ci08ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxNTkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0ZWQgdmFsdWVzIj4KLTxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5ncywgUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjUwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2VxdWVuY2UsIFByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI1MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImhpbnRzIC0gcXVlcnksIENyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmMTA5IiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJASWQsIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci08ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlIj48dG9waWMgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jc3RocmVmMTk0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIyMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iam9pbmVkIHRhYmxlcywgU2luZ2xlIFRhYmxlIEluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmMTA0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2luZ2xlIHRhYmxlLCBTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgLSBpbiBKYXZhIERldGFpbHMgdmlldywgSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIyMCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9Imluc3RhbGxhdGlvbiAtIERhbGksIFJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWYzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSmF2YSBwcm9qZWN0IC0gY29udmVydGluZyB0byBKUEEsIENvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNzdGhyZWYzNSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iam9pbiBjb2x1bW5zIj4KLTxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMiPjx0b3BpYyBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNzdGhyZWYyMDgiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjI0NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMgLSBpbmhlcml0YW5jZSwgU2luZ2xlIFRhYmxlIEluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmMTA1IiAvPjwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3Ij4KLTxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzLCBKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjIyNyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzLCBKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jc3RocmVmMjEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlLCBKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI3N0aHJlZjI4MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlLCBUaGUgSmF2YSBTb3VyY2UgUGFnZSI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYzNCIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIHByb2plY3QiPgotPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgZnJvbSBKYXZhLCBDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBuZXcsIENyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iaW1wbGVtZW50YXRpb24sIEpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMTkwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icGFnZSwgJmx0O2EgaWQ9JnF1b3Q7c3RocmVmMjkmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYyOSZxdW90OyZndDsmbHQ7L2EmZ3Q7U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMzEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJwbGF0Zm9ybSwgUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyNzQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJKUEEgU3RydWN0dXJlIHZpZXcsIEpQQSBTdHJ1Y3R1cmUgdmlldyI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNzdGhyZWYyNTQiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJsYXp5IGZldGNoLCBHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjM0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibGlicmFyeSAtIEpQQSwgSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYxOTEiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tbWFueSBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJATWFueVRvTWFueSwgTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTMyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIE1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEzMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFueS10by1vbmUgbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQE1hbnlUb09uZSwgTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzUiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hcHBlZCBzdXBlcmNsYXNzIj4KLTxlbnRyeSBrZXl3b3JkPSJATWFwcGVkU3VwZXJjbGFzcywgTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGVudGl0aWVzLCBDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTIiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgZmlsZSI+Ci08ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmNTcmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWY1NyZxdW90OyZndDsmbHQ7L2EmZ3Q7TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAzLmh0bSNzdGhyZWY2MCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlIj48dG9waWMgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jc3RocmVmMTk1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5ncyI+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIFVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiPjx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI3N0aHJlZjIyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYmFzaWMsIEJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTEzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZW1iZWRkZWQsIEVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE3IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZW1iZWRkZWQgSUQsIEVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTIxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSUQsIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ibWFueS10by1tYW55LCBNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMjkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW9uZSwgTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tbWFueSwgT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tb25lLCBPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQzIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icHJvYmxlbXMsIFZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNjkiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJ0cmFuc2llbnQsIFRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0OSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InZlcnNpb24sIFZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im5hbWVkIHF1ZXJpZXMiPgotPGVudHJ5IGtleXdvcmQ9ImVudGl0eSwgQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWYxMDYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJoaW50cywgQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWYxMTAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJuYXRpdmUgcXVlcmllcywgQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWYxMTEiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im5vbnBlcnNpc3RlbnQiPgotPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMsIEFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY3IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZpZWxkcy4gU2VlIHRyYW5zaWVudCI+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1tYW55IG1hcHBpbmciPgotPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnksIE9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTQyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIE9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTQwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tb25lIG1hcHBpbmciPgotPGVudHJ5IGtleXdvcmQ9IkBPbmVUb09uZSwgT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0NiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQ0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ib3JkZXJpbmcsIEdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDIiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9ybS54bWwgZmlsZSI+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIFRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jc3RocmVmMjQiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZywgSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYxOTMiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZywgTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNTciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJzYW1wbGUsIE1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI3N0aHJlZjU4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ib3ZlcnJpZGVzIC0gSlBBIGF0dHJpYnV0ZXMsIEF0dHJpYnV0ZSBvdmVycmlkZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI3N0aHJlZjIxNCIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVuY2UiPgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYxOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIGNvbm5lY3Rpb24sIFByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjc2IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iZGF0YWJhc2Ugc2NoZW1hLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3OSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImVudGl0eSBjbGFzcywgQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNjYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJvcHRpb25zLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3MSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InByb3ZpZGVyLCBNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlLnhtbCBmaWxlIj4KLTxlbnRyeSBrZXl3b3JkPSJhYm91dCwgVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0iY29uY2VwdHMwMDIuaHRtI3N0aHJlZjIzIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNDciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJXb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza3MwMDQuaHRtI3N0aHJlZjY0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJzYW1wbGUsIE1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY0OCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InN5bmNocm9uaXppbmcgd2l0aCBjbGFzc2VzLCBTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jc3RocmVmNTQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50IGVudGl0eSwgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjcwIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icGVyc3BlY3RpdmUgLSBKUEEgRGV2ZWxvcG1lbnQsIEpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jc3RocmVmMjgxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icGxhdGZvcm0gLSBKUEEsIFByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjczIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icHJvYmxlbXMsIFZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNjgiIC8+PC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InByb2plY3RzIC0gSlBBIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgbmV3Ij4KLTxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jc3RocmVmOSIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJvcHRpb25zLCBQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI3MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InF1ZXJ5IGhpbnRzLCBDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjEwOCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InF1aWNrIHN0YXJ0IC0gRGFsaSwgRGFsaSBxdWljayBzdGFydCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jc3RocmVmOCIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVxdWlyZW1lbnRzIj4KLTxlbnRyeSBrZXl3b3JkPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMsIFJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWY0IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCBlbnRpdGllcywgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjcyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2NoZW1hIC0gZGF0YWJhc2UsIFByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjc4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcywgU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMTYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgVGFibGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXcsIFNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjE5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlLCBTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwMCIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9InN1cGVyY2xhc3MsIE1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjg5IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyBjbGFzc2VzIHdpdGggcGVyc2lzdGVuY2UueG1sIGZpbGUsIFN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY1NSIgLz48L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb25zIj4KLTxlbnRyeSBrZXl3b3JkPSJUYWJsZSBBc3NvY2lhdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI3N0aHJlZjIwMyIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI3N0aHJlZjIwNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGVudGl0aWVzIGZyb20iPgotPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTU4IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iU2VsZWN0IFRhYmxlcyI+PHRvcGljIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI3N0aHJlZjIwMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iaW5oZXJpdGFuY2UsIFNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmMTAxIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5LCBTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIxNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcG9yYWwiPgotPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMzYiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjM4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0cmFuc2llbnQgbWFwcGluZyI+Ci08ZW50cnkga2V5d29yZD0iQFRyYW5zaWVudCwgVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTUyIiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iYWJvdXQsIFRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE1MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiBtYXBwaW5nIj4KLTxlbnRyeSBrZXl3b3JkPSJAVmVyc2lvbiwgVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1NiIgLz48L2VudHJ5PgotPGVudHJ5IGtleXdvcmQ9ImFib3V0LCBWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTU0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2aWV3cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMTEiIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjIyOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3LCBKUEEgU3RydWN0dXJlIHZpZXciPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jc3RocmVmMjUzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0id2FybmluZyBtZXNzYWdlcyAtIERhbGksIFZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNjciIC8+PC9lbnRyeT4KLTxlbnRyeSBrZXl3b3JkPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCksIFJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWY1IiAvPjwvZW50cnk+Ci08ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciwgV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY2MyIgLz48L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViZGJhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5MZWdhbDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIExlZ2FsIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjg3IiBuYW1lPSJzdGhyZWYyODciPjwvYT48L3A+Ci08aDE+TGVnYWw8L2gxPgotPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA2LCAyMDA5LCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgotPHA+VGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG0iPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMgZ3VpZGUuPC9hPjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWMwODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBEb2N1bWVudGF0aW9uIC0gRG9jCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1qcGFEZXZlbG9wbWVudD1KUEEgRGV2ZWxvcG1lbnQKLWNyZWF0ZUFKcGFQcm9qZWN0PUNyZWF0ZSBhIEpQQSBwcm9qZWN0Ci1jcmVhdGVBSnBhUHJvamVjdERlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IGNyZWF0ZSBhIEpQQSBwcm9qZWN0LgotY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHk9Q3JlYXRlIGEgcGVyc2lzdGVudCBlbnRpdHkKLWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgY3JlYXRlIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eS4KLU1hcEFQZXJzaXN0ZW50RW50aXR5PU1hcCBhIHBlcnNpc3RlbnQgZW50aXR5Ci1NYXBBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IG1hcCB0aGUgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGEgZGF0YWJhc2UgdGFibGUuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTZkM2UxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBUT0MgIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InRvYy54bWwiIHByaW1hcnk9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIEYxICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLQkJPGNvbnRleHRzIGZpbGU9ImNvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQudWkiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIEtleXdvcmQgSW5kZXggLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLQkJPGluZGV4IGZpbGU9ImluZGV4LnhtbCIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBDaGVhdHNoZWV0cyAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50Ij4KLQkJPGNhdGVnb3J5IG5hbWU9IkpQQSBEZXZlbG9wbWVudCIgaWQ9ImNvbS5qcGEuY2F0ZWdvcnkiLz4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJWNyZWF0ZUFKcGFQcm9qZWN0IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0LmNyZWF0ZXByb2plY3QxIj4KLQkJCTxkZXNjcmlwdGlvbj4lY3JlYXRlQUpwYVByb2plY3REZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5hZGRlbnRpdHkiPgotCQkJPGRlc2NyaXB0aW9uPiVjcmVhdGVBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlTWFwQVBlcnNpc3RlbnRFbnRpdHkiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0Lm1hcGVudGl0eSI+Ci0JCQk8ZGVzY3JpcHRpb24+JU1hcEFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhMjJjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eUNsYXNzUGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHkgQ2xhc3MgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IENsYXNzIHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGRUlHRiIgbmFtZT0iQ0lBRkVJR0YiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVudGl0eSBDbGFzcyBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPlByb2plY3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ1IHIxYzItdDUiPlRoZSBuYW1lIG9mIHRoZSBKUEEgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5Tb3VyY2UgRm9sZGVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NSByMWMyLXQ1Ij5UaGUgbG9jYXRpb24gb2YgdGhlIEpQQSBwcm9qZWN0J3Mgc3JjIGZvbGRlci48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5KYXZhIFBhY2thZ2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ1IHIxYzItdDUiPlRoZSBuYW1lIG9mIHRoZSBjbGFzcyBwYWNrYWdlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPkNsYXNzIG5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ1IHIxYzItdDUiPlRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPlN1cGVyY2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ1IHIxYzItdDUiPlNlbGVjdCB0aGUgc3VwZXJjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5Jbmhlcml0YW5jZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDUgcjFjMi10NSI+QmVjYXVzZSB0aGUgd2l6YXJkIGNyZWF0ZXMgYSBKYXZhIGNsYXNzIHdpdGggYW4gPGNvZGU+QEVudGl0eTwvY29kZT4gbm90YXRpb24sIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGVkIFN1cGVyY2xhc3M8L3NwYW4+IGlmIHlvdSBkZWZpbmVkIGEgc3VwZXJjbGFzcy48L3A+Ci08cD5UbyBhZGQgYW4gPGNvZGU+QEluaGVyaXRhbmNlPC9jb2RlPiBub3RhdGlvbiB0byB0aGUgZW50aXR5LCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkluaGVyaXRhbmNlPC9zcGFuPiBhbmQgdGhlbiBzZWxlY3Qgb25lIG9mIHRoZSBpbmhlcml0YW5jZSBtYXBwaW5nIHN0cmF0ZWdpZXMgKGRlc2NyaWJlZCBpbiBKU1IgMjIwKTo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TSU5HTEVfVEFCTEUgLS0gQWxsIGNsYXNzZXMgaW4gYSBoaWVyYXJjaHkgYXMgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlLiBUaGlzIGFubm90YXRpb24gaXMgd2l0aG91dCBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneS48L3A+Ci08L2xpPgotPGxpPgotPHA+VEFCTEVfUEVSX0NMQVNTIC0tIEVhY2ggY2xhc3MgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPkpPSU5FRCAtLSBUaGUgcm9vdCBvZiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHRhYmxlLiBFYWNoIHN1YmNsYXNzIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2VwYXJhdGUgdGFibGUgdGhhdCBjb250YWlucyB0aG9zZSBmaWVsZHMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIHN1YmNsYXNzIChub3QgaW5oZXJpdGVkIGZyb20gaXRzIHN1cGVyY2xhc3MpLCBhcyB3ZWxsIGFzIHRoZSBjb2x1bW4ocykgdGhhdCByZXByZXNlbnQgaXRzIHByaW1hcnkga2V5LiBUaGUgcHJpbWFyeSBrZXkgY29sdW1uKHMpIG9mIHRoZSBzdWJjbGFzcyB0YWJsZSBzZXJ2ZXMgYXMgYSBmb3JlaWduIGtleSB0byB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlIHN1cGVyY2xhc3MgdGFibGUuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ1IHIxYzMtdDUiPkVudGl0eTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij48YSBpZD0ic3RocmVmMTk1IiBuYW1lPSJzdGhyZWYxOTUiPjwvYT5YTUwgRW50aXR5IE1hcHBpbmdzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NSByMWMyLXQ1Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCB0byBlbnRpdHkgbWFwcGluZ3MgaW4gWE1MPC9zcGFuPiB0byBjcmVhdGUgWE1MIG1hcHBpbmdzIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LCByYXRoZXIgdGhhbiBhbm5vdGF0aW9ucy4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBpbmcgZmlsZTwvc3Bhbj4gZmllbGQgdG8gc3BlY2lmeSB0aGUgZmlsZSB0byB1c2UuIEJ5IGRlZmF1bHQsIG1hcHBpbmdzIGFyZSBzdG9yZWQgaW4gdGhlIDxjb2RlPk1FVEEtSU5GL29ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhY2NhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFERUNJQSIgbmFtZT0iQ0lBREVDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk2IiBuYW1lPSJzdGhyZWYxOTYiPjwvYT48YSBpZD0ic3RocmVmMTk3IiBuYW1lPSJzdGhyZWYxOTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIHRvIGJlIGNvbnZlcnRlZCB0byBpbmZvcm1hbC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5FbnRpdHkgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMi10NiI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZW50ZXJlZCBhcyB0aGUgY2xhc3MgbmFtZS4gSWYgdGhlIGVudGl0eSBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY2xhc3MgbmFtZSwgdGhlbiB0aGUgZW50aXR5IG5hbWUgaXMgYWRkZWQgYXMgYW4gYXR0cmlidXRlLiBGb3IgZXhhbXBsZTogPGNvZGU+QEVudGl0eShuYW1lPSJFbnRpdHlOYW1lIik8L2NvZGU+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMy10NiI+Ci08cD5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5UYWJsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMyLXQ2Ij4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUgbmFtZSB0byB0aGUgZW50aXR5IG5hbWUuIE90aGVyd2lzZSwgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBlbnRlciB0aGUgbmFtZSBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+VGFibGUgTmFtZTwvc3Bhbj4gZmllbGQuIFRoZXNlIG9wdGlvbnMgcmVzdWx0IGluIHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+QFRhYmxlPC9jb2RlPiBvcHRpb24gdG8gdGhlIEphdmEgY2xhc3MgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ2IHIxYzMtdDYiPgotPHA+VXNlIGRlZmF1bHQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RW50aXR5IEZpZWxkczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMi10NiI+Ci08cD5DbGljayB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gYnV0dG9uIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdXNpbmcgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiBUaGlzIGRpYWxvZyBlbmFibGUgeW91IHRvIGJ1aWxkIGEgZmllbGQgYnkgZW50ZXJpbmcgYSBmaWVsZCBuYW1lIGFuZCBzZWxlY3RpbmcgYW1vbmcgcGVyc2lzdGVuY2UgdHlwZXMuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiBvcHRpb24gZW5hYmxlcyB5b3UgdG8gbWFyayBhIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuIFRoZSBkaWFsb2cncyA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbiBlbmFibGVzIHlvdSB0byBhZGQgb3RoZXIgcGVyc2lzdGVuY2UgdHlwZXMgZGVzY3JpYmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FZGl0PC9zcGFuPiBidXR0b24gZW5hYmxlcyB5b3UgdG8gY2hhbmdlIHRoZSBuYW1lIG9yIHR5cGUgc2V0IGZvciBhIHBlcnNpc3RlbnQgZmllbGQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NiByMWMzLXQ2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5BY2Nlc3MgVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBmaWVsZC1iYXNlZCBvciBwcm9wZXJ0eS1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzMtdDYiPgotPHA+RmllbGQ8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDhmZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkIENvbnZlcnRlciBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFkZCBDb252ZXJ0ZXIgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBR0NHSUoiIG5hbWU9IkNJQUdDR0lKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5BZGQgQ29udmVydGVyIGRpYWxvZzwvaDE+Ci08cD5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIGEgbmV3IEVjbGlwc2VMaW5rIGNvbnZlcnRlci48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4Ij4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbE1heCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgb3B0aW9ucyBvbiB0aGUgTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzkiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzOSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM5IiBoZWFkZXJzPSJyMWMxLXQzOSI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM5IHIxYzItdDM5Ij5FbnRlciB0aGUgbmFtZSBmb3IgdGhpcyBjb252ZXJ0ZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5UeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzkgcjFjMi10MzkiPlNlbGVjdCB0aGUgY29udmVydGVyIHR5cGU6Ci08dWw+Ci08bGk+Ci08cD5DdXN0b208L3A+Ci08L2xpPgotPGxpPgotPHA+T2JqZWN0IHR5cGU8L3A+Ci08L2xpPgotPGxpPgotPHA+U3RydWN0PC9wPgotPC9saT4KLTxsaT4KLTxwPlR5cGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTYzOWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZJSUZIIiBuYW1lPSJDSUFGSUlGSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXNzb2NpYXRpb24gQ2FyZGluYWxpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwOSIgbmFtZT0ic3RocmVmMjA5Ij48L2E+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgY2FyZGluYWxpdHkgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuIERlcGVuZGluZyBvbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFzc29jaWF0aW9uIEtpbmQ8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbiBDb2x1bW5zPC9zcGFuPiB0aGF0IHlvdSBzZWxlY3RlZCBwcmV2aW91c2x5LCBzb21lIGFzc29jaWF0aW9ucyBtYXkgbm90IGJlIGF2YWlsYWJsZS48L3A+Ci08dWw+Ci08bGk+Ci08cD5NYW55IHRvIG9uZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbmUgdG8gbWFueTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbmUgdG8gb25lPC9wPgotPC9saT4KLTxsaT4KLTxwPk1hbnkgdG8gbWFueTwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhjOTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Bc3NvY2lhdGlvbiBUYWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFzc29jaWF0aW9uIFRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdKSERDIiBuYW1lPSJDSUFHSkhEQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXNzb2NpYXRpb24gVGFibGVzPC9oMT4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGZvciBhbiBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBBc3NvY2lhdGlvbiBUYWJsZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEFzc29jaWF0aW9uIFRhYmxlcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTIiIGhlYWRlcnM9InIxYzEtdDEyIj5Bc3NvY2lhdGlvbiBraW5kPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTIgcjFjMi10MTIiPlNwZWNpZnkgaWYgdGhlIGFzc29jaWF0aW9uIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5TaW1wbGU8L3NwYW4+ICgxOk0pIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IChNOk0pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMiIgaGVhZGVycz0icjFjMS10MTIiPkFzc29jaWF0aW9uIHRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEyIHIxYzItdDEyIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGUgU2VsZWN0aW9uPC9zcGFuPiwgdGhlbiBzZWxlY3QgdGhlIHR3byB0YWJsZXMgdG8gYXNzb2NpYXRlLgotPHA+V2hlbiBjcmVhdGluZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IGFzc29jaWF0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luIFRhYmxlPC9zcGFuPiBmb3IgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ZTgxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHQkZKRSIgbmFtZT0iQ0lBR0JGSkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIEdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyBXaXphcmQgdG8gY3JlYXRlIGVudGl0aWVzIGZyb20geW91ciBkYXRhYmFzZSB0YWJsZXMuPC9wPgotPHA+VGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI0NJQUhDR0VFIj5TZWxlY3QgVGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI0NJQUNESUNCIj5UYWJsZSBBc3NvY2lhdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI0NJQUNJR0VFIj5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNWJlZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdHR0RGIiBuYW1lPSJDSUFHR0dERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9oMT4KLTxwPlRoZSBDcmVhdGUgSlBBIHdpemFyZCBlbmFibGVzIHlvdSB0byBxdWlja2x5IGFkZCBhbiBlbnRpdHkgYW5kIGFsc28gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGF0IGVudGl0eS4gSW4gYWRkaXRpb24sIHRoaXMgd2l6YXJkIGFkZHMgdGhlIGFjY2Vzc29yIG1ldGhvZHMgKDxjb2RlPmdldHRlcjwvY29kZT4gYW5kIDxjb2RlPnNldHRlcjwvY29kZT4pIGluIHRoZSBjbGFzcyBmaWxlLiBUaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMWQxMTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGR0hJRiIgbmFtZT0iQ0lBRkdISUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNiIgbmFtZT0ic3RocmVmMjA2Ij48L2E+PGEgaWQ9InN0aHJlZjIwNyIgbmFtZT0ic3RocmVmMjA3Ij48L2E+VXNlIHRoZSBDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCB0byBzcGVjaWZ5IGFzc29jaWF0aW9uIHRhYmxlcyB3aGVuIGdlbmVyYXRpbmcgYW4gZW50aXR5LjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIj5Bc3NvY2lhdGlvbiBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qb2luX2NvbHVtbnMuaHRtI0NJQUVHRUVHIj5Kb2luIENvbHVtbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jQ0lBRklJRkgiPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzBlNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNJR0VFIiBuYW1lPSJDSUFDSUdFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNSIgbmFtZT0ic3RocmVmMjA1Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBjdXN0b21pemUgZWFjaCBnZW5lcmF0ZWQgZW50aXR5LiBTZWxlY3QgYW4gaXRlbSBpbiB0aGUgVGFibGUgYW5kIGNvbHVtbnMgYXJlYSwgdGhlbiBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkcyBmb3IgZWFjaCBpdGVtLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSW5kaXZpZHVhbCBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSW5kaXZpZHVhbCBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDExIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj5UYWJsZSBNYXBwaW5nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTEgcjFjMi10MTEiPlVzZSB0aGVzZSBvcHRpb25zIHRvIGRlZmluZSB0aGUgdGFibGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj4mbmJzcDsmbmJzcDtLZXkmbmJzcDtnZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMSByMWMyLXQxMSI+U2VsZWN0IHRoZSBnZW5lcmF0b3IgdXNlZCBmb3IgdGhpcyBtYXBwaW5nLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO1NlcXVlbmNlJm5ic3A7bmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDExIHIxYzItdDExIj5FbnRlciBhIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZS4KLTxwPllvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJib2xkIj4kdGFibGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+JHBrPC9zcGFuPiBhcyB2YXJpYWJsZXMgaW4gdGhlIG5hbWUuIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHRhYmxlIG5hbWUgYW5kIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lIChyZXNwZWN0aXZlbHkpIHdoZW4gRGFsaSBnZW5lcmF0ZXMgYSB0YWJsZSBtYXBwaW5nLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO0VudGl0eSZuYnNwO2FjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDExIHIxYzItdDExIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGVudGl0eSBhY2Nlc3MgbWV0aG9kOiA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQ8L3NwYW4+IChkZWZhdWx0KSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHk8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPkRvbWFpbiBKYXZhIENsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTEgcjFjMi10MTEiPlVzZSB0aGVzZSBvcHRpb25zIHRvIGRlZmluZSB0aGUgY2xhc3MgaW5mb3JtYXRpb24gKDxzcGFuIGNsYXNzPSJib2xkIj5TdXBlcmNsYXNzPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkludGVyZmFjZXM8L3NwYW4+KSBmb3IgdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNjQ2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRUpEQkUiIG5hbWU9IkNJQUVKREJFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA0IiBuYW1lPSJzdGhyZWYyMDQiPjwvYT5Vc2UgdGhpcyBwYWdlIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gRGFsaSB3aWxsIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGVudGl0aWVzIGZyb20gdGhlIGRhdGFiYXNlIHRhYmxlcy4gWW91IHdpbGwgYmUgYWJsZSB0byBvdmVycmlkZSB0aGlzIGluZm9ybWF0aW9uIGZvciBzcGVjaWZpYyBlbnRpdGllcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBDdXN0b20gRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEwIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj5UYWJsZSBNYXBwaW5nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTAgcjFjMi10MTAiPlVzZSB0aGVzZSBvcHRpb25zIHRvIGRlZmluZSB0aGUgdGFibGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtLZXkmbmJzcDtnZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMCByMWMyLXQxMCI+U2VsZWN0IHRoZSBnZW5lcmF0b3IgdXNlZCBmb3IgdGhpcyBtYXBwaW5nLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO1NlcXVlbmNlJm5ic3A7bmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEwIHIxYzItdDEwIj5FbnRlciBhIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZS4KLTxwPllvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJib2xkIj4kdGFibGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+JHBrPC9zcGFuPiBhcyB2YXJpYWJsZXMgaW4gdGhlIG5hbWUuIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHRhYmxlIG5hbWUgYW5kIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lIChyZXNwZWN0aXZlbHkpIHdoZW4gRGFsaSBnZW5lcmF0ZXMgYSB0YWJsZSBtYXBwaW5nLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO0VudGl0eSZuYnNwO2FjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGVudGl0eSBhY2Nlc3MgbWV0aG9kOiA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQ8L3NwYW4+IChkZWZhdWx0KSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHk8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO0Fzc29jaWF0aW9ucyZuYnNwO2ZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgZmV0Y2ggbW9kZSBmb3IgYXNzb2NpYXRpb25zOiA8c3BhbiBjbGFzcz0iYm9sZCI+RGVmYXVsdDwvc3Bhbj4sIGFzIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uIChkZWZhdWx0KSwgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkxhenk8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO0NvbGxlY3Rpb24mbmJzcDt0eXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgaWYgdGhlIGNvbGxlY3Rpb24gcHJvcGVydGllcyBhcmUgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2V0PC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+TGlzdDwvc3Bhbj4uCi08cD5FbmFibGUgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BbHdheXMgZ2VuZXJhdGUgb3B0aW9uYWwgSlBBIGFubm90YXRpb25zIGFuZCBEREwgcGFyYW1ldGVyczwvc3Bhbj4gb3B0aW9uIHRvIGhhdmUgRGFsaSBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIGVudGl0eS48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj5Eb21haW4gSmF2YSBDbGFzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEwIHIxYzItdDEwIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIGNsYXNzIGluZm9ybWF0aW9uICg8c3BhbiBjbGFzcz0iYm9sZCI+UGFja2FnZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJib2xkIj5TdXBlcmNsYXNzPC9zcGFuPiwgYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5JbnRlcmZhY2VzPC9zcGFuPikgZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBiODU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dER0hDIiBuYW1lPSJDQUNHREdIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9oMT4KLTxwPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIGRlZmF1bHQgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGFyZWFzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMy5odG0jQ0FDQ0FDR0giPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDRUFHQkciPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiPkdlbmVyYXRvcnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNi5odG0jQ0lBSUJBQUoiPlF1ZXJpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0lBREdDSUQiPkNvbnZlcnRlcnM8L2E+ICh3aGVuIHVzaW5nIEVjbGlwc2VMaW5rKTwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhlc2UgZGVmYXVsdHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHNldHRpbmdzIG9uIGEgc3BlY2lmaWMgZW50aXR5IG9yIG1hcHBpbmcuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MzliMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVERUpGIiBuYW1lPSJDSUFFREVKRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2c8L2gxPgotPHA+U3BlY2lmeSB0aGUgbG9jYXRpb24gYW5kIHByb3BlcnRpZXMgb2YgdGhlIEVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZSAoPGNvZGU+ZWNsaXNwZWxpbmstb3JtLnhtbDwvY29kZT4pLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsTWF4IiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBvcHRpb25zIG9uIHRoZSBOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5Qcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzggcjFjMi10MzgiPlNlbGVjdCB0aGUgcHJvamVjdCBpbiB3aGljaCB0byBhZGQgdGhlIG1hcHBpbmcgZmlsZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5Tb3VyY2UgZm9sZGVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzggcjFjMi10MzgiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGFuZCBzZWxlY3QgdGhlIHNvdXJjZSBmaWxlIGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT4uLi88L2NvZGU+PGNvZGU+PHNwYW4gY2xhc3M9ImNvZGVpbmxpbmVpdGFsaWMiPiZsdDtQUk9KRUNUJmd0Ozwvc3Bhbj48L2NvZGU+PGNvZGU+L3NyYzwvY29kZT4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+RmlsZSBwYXRoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzggcjFjMi10MzgiPkVudGVyIHRoZSBmaWxlbmFtZSBhbmQgcGF0aCBvZiB0aGUgbWFwcGluZyBmaWxlLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sPC9jb2RlPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5EZWZhdWx0IGFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM4IHIxYzItdDM4Ij5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyA8c3BhbiBjbGFzcz0iYm9sZCI+ZmllbGQ8L3NwYW4+LWJhc2VkIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5wcm9wZXJ0eTwvc3Bhbj4tYmFzZWQsIGFzIGRlZmluZWQgaW4gdGhlIEpQQSBzcGVjaWZpY2F0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzOCIgaGVhZGVycz0icjFjMS10MzgiPkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzggcjFjMi10MzgiPlNwZWNpZnkgaWYgdGhpcyBtYXBwaW5nIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0ICg8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+KS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij4mbmJzcDsmbmJzcDtQZXJzaXN0ZW5jZSZuYnNwO1VuaXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzOCByMWMyLXQzOCI+U2VsZWN0IHRoZSBwZXJzaXN0ZW5jZSB1bml0IGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMy5odG0jQ0lBSkVJREoiPk1hcHBpbmcgRmlsZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGU0ZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXZhX3BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KYXZhIFBhZ2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkphdmEgUGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdFQkFBIiBuYW1lPSJDSUFHRUJBQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SmF2YSBQYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoZSBKYXZhIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MyIgaGVhZGVycz0icjFjMS10MyI+U291cmNlIGZvbGRlcnMgb24gYnVpbGQgcGF0aDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMgcjFjMi10MyI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBGb2xkZXI8L3NwYW4+IHRvIHNlbGVjdCBhbiBleGlzdGluZyBKYXZhIHNvdXJjZSBmb2xkZXIgdG8gYWRkIHRvIHRoaXMgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzMtdDMiPkVjbGlwc2VMaW5rPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPkRlZmF1bHQgb3V0cHV0IGZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMgcjFjMi10MyI+U3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlJm5ic3A7PGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzMtdDMiPmJ1aWxkXGNsYXNzZXM8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGFlOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qb2luX2NvbHVtbnMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Kb2luIENvbHVtbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpvaW4gQ29sdW1ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVHRUVHIiBuYW1lPSJDSUFFR0VFRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBDb2x1bW5zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDgiIG5hbWU9InN0aHJlZjIwOCI+PC9hPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuPC9wPgotPHA+Q2xpY2sgQWRkIHRvIHNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucyBiZXR3ZWVuIHRoZSB0d28gdGFibGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmIxNTJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBGYWNldCBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRmFjZXQgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lGRElGIiBuYW1lPSJDQUNJRkRJRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIEZhY2V0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NCByMWMyLXQ0Ij5WZW5kb3Itc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMy10NCI+RWNsaXBzZUxpbms8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MCIgbmFtZT0ic3RocmVmMTkwIj48L2E+PGEgaWQ9InN0aHJlZjE5MSIgbmFtZT0ic3RocmVmMTkxIj48L2E+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMyLXQ0Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMi10NCI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2VyIExpYnJhcnk8L3NwYW4+IHRvIHNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdXNlci1kZWZpbmVkIG9yIGRvd25sb2FkZWQgbGlicmFyaWVzLgotPHA+SWYgeW91IHNlbGVjdCBEaXNhYmxlLCB5b3UgbXVzdCBtYW51YWxseSBpbmNsdWRlIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NCByMWMzLXQ0Ij5Vc2VyIExpYnJhcnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7SW5jbHVkZSBsaWJyYXJpZXMgd2l0aCB0aGlzIGFwcGxpY2F0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0IHIxYzMtdDQiPlNlbGVjdGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC4gRGFsaSByZXF1aXJlcyBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgYW5kIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0IHIxYzItdDQiPlNlbGVjdCBhIHNjaGVtYSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMzLXQ0Ij5UaGUgdmFsdWUgY2FsY3VsYXRlZCBieSBEYWxpLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5KUEEgSW1wbGVtZW50YXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0byB1c2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBhdCBydW50aW1lPC9zcGFuPiwgb3Igc2VsZWN0IGEgc3BlY2lmaWMgPHNwYW4gY2xhc3M9ImJvbGQiPmltcGxlbWVudGF0aW9uIGxpYnJhcnk8L3NwYW4+IHRoYXQgY29udGFpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYW5kIGVudGl0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgSmF2YSBCdWlsZCBQYXRoLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0byBjcmVhdGUgYSBkZWZhdWx0IGxpYnJhcnkgZm9yIHRoZSBwcm9qZWN0IG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L3NwYW4+IHRvIGRlZmluZSBhZGRpdGlvbmFsIGxpYnJhcmllcy48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIHdvcmtpbmcgd2l0aCBKUEEgcHJvamVjdHMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMzLXQ0Ij5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQgcjFjMy10NCI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij48YSBpZD0ic3RocmVmMTkzIiBuYW1lPSJzdGhyZWYxOTMiPjwvYT5DcmVhdGUgPGNvZGU+b3JtLnhtbDwvY29kZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhIGRlZmF1bHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgeW91ciBlbnRpdHkgbWFwcGluZ3MgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQgcjFjMy10NCI+U2VsZWN0ZWQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOTdjMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JIRklKIiBuYW1lPSJDQUNCSEZJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBEZXRhaWxzIHZpZXc8L3NwYW4+IGZvciBlYWNoIG1hcHBpbmcgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNiI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10MTYiPkF2YWlsYWJsZSBmb3IgTWFwcGluZyBUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPk1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMyLXQxNiI+Q2xpY2tpbmcgdGhlIG5hbWUgb2YgdGhlIG1hcHBpbmcgdHlwZSwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBoeXBlcmxpbmssIGludm9rZXMgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBVc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMy10MTYiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjNC10MTYiPkFsbCBtYXBwaW5nIHR5cGVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0dDQkhCIiBuYW1lPSJDQUNHQ0JIQiI+PC9hPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzItdDE2Ij48YSBpZD0ic3RocmVmMjMwIiBuYW1lPSJzdGhyZWYyMzAiPjwvYT48YSBpZD0ic3RocmVmMjMxIiBuYW1lPSJzdGhyZWYyMzEiPjwvYT5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzMtdDE2Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTguaHRtI0JBQkhJQklJIj5WZXJzaW9uIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzItdDE2Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1RhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMi10MTYiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtJbnNlcnRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMi10MTYiPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgSU5TRVJUPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE2IHIxYzMtdDE2Ij5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtVcGRhdGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoaXMgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgVVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzMtdDE2Ij5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtVbmlxdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgPGNvZGU+VU5JUVVFPC9jb2RlPiBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzMtdDE2Ij5GYWxzZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7TnVsbGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gYWxsb3dzIG51bGwgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE2IHIxYzMtdDE2Ij5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7TGVuZ3RoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSBjb2x1bW4gbGVuZ3RoLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxNiByMWMzLXQxNiI+MjU1PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1ByZWNpc2lvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgcHJlY2lzaW9uIGZvciB0aGUgY29sdW1uIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTYgcjFjMy10MTYiPjA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7U2NhbGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIG51bWJlciBvZiBkaWdpdHMgdGhhdCBhcHBlYXIgdG8gdGhlIHJpZ2h0IG9mIHRoZSBkZWNpbWFsIHBvaW50LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWMzLXQxNiI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtDb2x1bW4gRGVmaW5pdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWMyLXQxNiI+RGVmaW5lIHRoZSBEREwgZm9yIGEgY29sdW1uLiBUaGlzIGlzIHVzZWQgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIGdlbmVyYXRlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTRjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDR0dHSEIiIG5hbWU9IkNBQ0dHR0hCIj48L2E+PGEgaWQ9InN0aHJlZjIzMiIgbmFtZT0ic3RocmVmMjMyIj48L2E+PGEgaWQ9InN0aHJlZjIzMyIgbmFtZT0ic3RocmVmMjMzIj48L2E+PGEgaWQ9InN0aHJlZjIzNCIgbmFtZT0ic3RocmVmMjM0Ij48L2E+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxNiByMWMyLXQxNiI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6Ci08dWw+Ci08bGk+Ci08cD5FYWdlciAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIGluIGJlZm9yZSBpdCBpcyBhY3R1YWxseSBuZWVkZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenkgJm5kYXNoOyBEYXRhIGlzIGxvYWRlZCBvbmx5IHdoZW4gcmVxdWlyZWQgYnkgdGhlIHRyYW5zYWN0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzMtdDE2Ij5FYWdlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTVjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDE2IHIxYzMtdDE2Ij5ZZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTZjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDQkJJQkkiIG5hbWU9IkNBQ0JCSUJJIj48L2E+PGEgaWQ9InN0aHJlZjIzNSIgbmFtZT0ic3RocmVmMjM1Ij48L2E+TG9iPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGlmIHRoZSBmaWVsZCBpcyBtYXBwZWQgdG8gPGNvZGU+amF2YS5zcWwuQ2xvYjwvY29kZT4gb3IgPGNvZGU+amF2YS5zcWwuQmxvYjwvY29kZT4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATG9iPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNmMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNFQUpHRCIgbmFtZT0iQ0FDRUFKR0QiPjwvYT48YSBpZD0ic3RocmVmMjM2IiBuYW1lPSJzdGhyZWYyMzYiPjwvYT48YSBpZD0ic3RocmVmMjM3IiBuYW1lPSJzdGhyZWYyMzciPjwvYT48YSBpZD0ic3RocmVmMjM4IiBuYW1lPSJzdGhyZWYyMzgiPjwvYT5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08dWw+Ci08bGk+Ci08cD5EYXRlICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZSAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcCAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBUZW1wb3JhbDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTdjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMThjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0ic3RocmVmMjM5IiBuYW1lPSJzdGhyZWYyMzkiPjwvYT48YSBpZD0ic3RocmVmMjQwIiBuYW1lPSJzdGhyZWYyNDAiPjwvYT48YSBpZD0ic3RocmVmMjQxIiBuYW1lPSJzdGhyZWYyNDEiPjwvYT5FbnVtZXJhdGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE4YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgc3VpdHMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgb3IgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLgotPHVsPgotPGxpPgotPHA+b3JkaW5hbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5TdHJpbmc8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW51bWVyYXRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjMy10MTYiPk9yZGluYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjNC10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTljMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDE2IHIxYzItdDE2Ij5UaGUgcGVyc2lzdGVudCBlbnRpdHkgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjBjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDSkFJSEIiIG5hbWU9IkNBQ0pBSUhCIj48L2E+Q2FzY2FkZSBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgZW50aXR5LgotPHVsPgotPGxpPgotPHA+QWxsICZuZGFzaDsgQWxsIG9wZXJhdGlvbnM8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyc2lzdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NZXJnZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Nb3ZlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZWZyZXNoPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjBjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjFjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDSkRKSkEiIG5hbWU9IkNBQ0pESkpBIj48L2E+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzItdDE2Ij5UaGUgZmllbGQgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgIm93bnMiIHRoZSByZWxhdGlvbnNoaXAuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgb25seSBvbiB0aGUgbm9uLW93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDREFESUgiIG5hbWU9IkNBQ0RBRElIIj48L2E+PGEgaWQ9InN0aHJlZjI0MiIgbmFtZT0ic3RocmVmMjQyIj48L2E+PGEgaWQ9InN0aHJlZjI0MyIgbmFtZT0ic3RocmVmMjQzIj48L2E+T3JkZXIgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5OgotPHVsPgotPGxpPgotPHA+Tm8gb3JkZXJpbmc8L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXk8L3A+Ci08L2xpPgotPGxpPgotPHA+Q3VzdG9tIG9yZGVyaW5nPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT3JkZXJCeTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTYgcjFjMy10MTYiPlByaW1hcnkga2V5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+LiA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzItdDE2Ij5PdmVycmlkZXMgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljPC9zcGFuPiBtYXBwaW5ncyBvZiBhIG1hcHBlZCBzdXBlcmNsYXNzIChmb3IgZXhhbXBsZSwgaWYgdGhlIGluaGVyaXRlZCBjb2x1bW4gbmFtZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBhIHByZS1leGlzdGluZyBkYXRhIG1vZGVsLCBvciBpbnZhbGlkIGFzIGEgY29sdW1uIG5hbWUgaW4geW91ciBkYXRhYmFzZSkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjNjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4KLTxwPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48L3A+Ci08YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3QuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3QuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjJlNGEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk5ldyBKUEEgUHJvamVjdCBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JKQUdDIiBuYW1lPSJDQUNCSkFHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIE5ldyBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlByb2plY3QgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+TmFtZSBvZiB0aGUgRWNsaXBzZSBKUEEgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IGNvbnRlbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5Mb2NhdGlvbiBvZiB0aGUgd29ya3NwYWNlIGluIHdoaWNoIHRvIHNhdmUgdGhlIHByb2plY3QuCi08cD5VbnNlbGVjdCBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBEZWZhdWx0PC9zcGFuPiBvcHRpb24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzMtdDIiPkN1cnJlbnQgd29ya3NwYWNlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlRhcmdldCBydW50aW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcmUtZGVmaW5lZCB0YXJnZXQgZm9yIHRoZSBwcm9qZWN0LgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGVudmlyb25tZW50IHdpdGggdGhlIE5ldyBTZXJ2ZXIgUnVudGltZSB3aXphcmQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MiIgaGVhZGVycz0icjFjMS10MiI+Q29uZmlndXJhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyIHIxYzItdDIiPlNlbGVjdCBhIHByb2plY3QgY29uZmlndXJhdGlvbiB3aXRoIHByZS1kZWZpbmVkIGZhY2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Jmx0O2N1c3RvbSZndDs8L3NwYW4+IHRvIG1hbnVhbGx5IHNlbGVjdCB0aGUgZmFjZXRzIGZvciB0aGlzIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMzLXQyIj5VdGlsaXR5IEpQQSBwcm9qZWN0IHdpdGggSmF2YSA1LjA8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MiIgaGVhZGVycz0icjFjMS10MiI+RUFSIG1lbWJlcnNoaXA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyIHIxYzItdDIiPlNwZWNpZnkgaWYgdGhpcyBwcm9qZWN0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVBUiBQcm9qZWN0IE5hbWU8L3NwYW4+LCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3PC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgRUFSIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MiIgaGVhZGVycz0icjFjMS10MiI+V29ya2luZyBzZXRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MiByMWMyLXQyIj5TcGVjaWZ5IGlmIHRoaXMgcHJvamVjdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW4gZXhpc3Rpbmcgd29ya2luZyBzZXQuIFRoZSBkcm9wIGRvd24gZmllbGQgc2hvd3MgYSBsaXN0IG9mIHByZXZpb3VzIHNlbGVjdGVkIHdvcmtpbmcgc2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHByb2plY3QgdG8gd29ya2luZyBzZXRzPC9zcGFuPiwgdGhlbiBzZWxlY3QgYSB3b3JraW5nIHNldCBpbiB3aGljaCB0byBhZGQgdGhpcyBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTJjODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkpHQkciIG5hbWU9IkNBQ0JKR0JHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTg5IiBuYW1lPSJzdGhyZWYxODkiPjwvYT5UaGUgQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgSmF2YSBwcm9qZWN0IHVzaW5nIEpQQS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2phdmFfcGFnZS5odG0jQ0lBR0VCQUEiPkphdmEgUGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJmYjQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0lGR0oiIG5hbWU9IkNJQUNJRkdKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgcHJvcGVydGllcyBhdmFpbGFibGUgaW4gdGhlIEdlbmVyYWwgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjU2IiBuYW1lPSJzdGhyZWYyNTYiPjwvYT48YSBpZD0ic3RocmVmMjU3IiBuYW1lPSJzdGhyZWYyNTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYWwgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgR2VuZXJhbCBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sJnJzcXVvO3MgR2VuZXJhbCBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+TmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzItdDI0Ij4KLTxwPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzMtdDI0Ij4KLTxwPlRoZSBwcm9qZWN0IG5hbWUuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5QZXJzaXN0ZW5jZSBQcm92aWRlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI0IHIxYzItdDI0Ij4KLTxwPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlci48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMzLXQyNCI+Ci08cD5EZXRlcm1pbmVkIGJ5IHRoZSBzZXJ2ZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5EZXNjcmlwdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI0IHIxYzItdDI0Ij4KLTxwPkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4gVGhpcyBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5NYW5hZ2VkIENsYXNzZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNCByMWMyLXQyNCI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBjbGFzc2VzIG1hbmFnZWQgdGhyb3VnaCB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMyLXQyNCI+Ci08cD5TZWxlY3QgdG8gaW5jbHVkZSBhbGwgYW5ub3RhdGVkIGVudGl0eSBjbGFzc2VzIGluIHRoZSByb290IG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI0IHIxYzMtdDI0Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5YTUwgTWFwcGluZyBGaWxlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzItdDI0Ij4KLTxwPkFkZCBvciByZW1vdmUgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgWE1MIGZpbGVzIHRoYXQgZGVmaW5lIHRoZSBjbGFzc2VzIHRvIGJlIG1hbmFnZWQgYnkgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjQgcjFjMy10MjQiPgotPHA+TWV0YS1JTkZcb3JtLnhtbDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmNTc1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJRkJBRiIgbmFtZT0iQkFCSUZCQUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjI3IiBuYW1lPSJzdGhyZWYyMjciPjwvYT48YSBpZD0ic3RocmVmMjI4IiBuYW1lPSJzdGhyZWYyMjgiPjwvYT48YSBpZD0ic3RocmVmMjI5IiBuYW1lPSJzdGhyZWYyMjkiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXBwZWQgYXR0cmlidXRlIGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGFyZWFzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI0NBQ0JBRUJDIj5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIj5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jQ0FDRkNDQUIiPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDI2ZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIFN0cnVjdHVyZSB2aWV3PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFR0dGRSIgbmFtZT0iQkFCRUdHRkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBTdHJ1Y3R1cmUgdmlldzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjUzIiBuYW1lPSJzdGhyZWYyNTMiPjwvYT48YSBpZD0ic3RocmVmMjU0IiBuYW1lPSJzdGhyZWYyNTQiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBTdHJ1Y3R1cmU8L3NwYW4+IHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIHNob3duIGluIHRoZSBvdXRsaW5lIGFyZSB0aGUgZW50aXR5IGFuZCBpdHMgZmllbGRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI1NSIgbmFtZT0ic3RocmVmMjU1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZyIgYWx0PSJTYW1wbGUgSlBBIFN0cnVjdHVyZSB2aWV3IGZvciBhbiBlbnRpdHkuIiB0aXRsZT0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0M2FjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJRkJEQiIgbmFtZT0iQkFCSUZCREIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjgwIiBuYW1lPSJzdGhyZWYyODAiPjwvYT48YSBpZD0ic3RocmVmMjgxIiBuYW1lPSJzdGhyZWYyODEiPjwvYT5UaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvc3Bhbj4gZGVmaW5lcyB0aGUgaW5pdGlhbCBzZXQgYW5kIGxheW91dCBvZiB2aWV3cyBpbiB0aGUgV29ya2JlbmNoIHdpbmRvdyB3aGVuIHVzaW5nIERhbGkuIEJ5IGRlZmF1bHQsIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9zcGFuPiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHZpZXdzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY29uY2VwdHMtNC5odG0iPlBlcnNwZWN0aXZlczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzk3NzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkFFQkIiIG5hbWU9IkJBQkZBRUJCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMTAiIG5hbWU9InN0aHJlZjIxMCI+PC9hPjxhIGlkPSJzdGhyZWYyMTEiIG5hbWU9InN0aHJlZjIxMSI+PC9hPjxhIGlkPSJzdGhyZWYyMTIiIG5hbWU9InN0aHJlZjIxMiI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVudGl0eSBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyB0YWJzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giPkF0dHJpYnV0ZSBvdmVycmlkZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jQ0FDQkhJREEiPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNDQUNGSEdIRSI+SW5oZXJpdGFuY2UgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlNmVlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNDSElEIiBuYW1lPSJDSUFDQ0hJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvaDE+Ci08cD5UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdGhhdCBlbmFibGVzIHlvdSB0byB1cGRhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiBGb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgcGVyaXNpc3RlbmNlLnhtbCBFZGl0b3IgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiPkxvZ2dpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZSBmb2xsb3dpbmcgc3Vic2V0IG9mIHRoZXNlIHBhZ2VzIGlzIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk4MzU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZDQ0FCIiBuYW1lPSJDQUNGQ0NBQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvc3Bhbj4gYXJlYSBpbiBKUEEgRGV0YWlscyB2aWV3IGZvciA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+IHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+PGEgaWQ9IkNBQ0JBSkJDIiBuYW1lPSJDQUNCQUpCQyI+PC9hPlByaW1hcnkgS2V5IEdlbmVyYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOSByMWMyLXQxOSI+PGEgaWQ9InN0aHJlZjI0OSIgbmFtZT0ic3RocmVmMjQ5Ij48L2E+PGEgaWQ9InN0aHJlZjI1MCIgbmFtZT0ic3RocmVmMjUwIj48L2E+VGhlc2UgZmllbGRzIGRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZC4gVGhlc2UgZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBHZW5lcmF0ZWRWYWx1ZTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOSByMWMzLXQxOSI+R2VuZXJhdGVkIFZhbHVlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+PGEgaWQ9IkNBQ0pFRUVDIiBuYW1lPSJDQUNKRUVFQyI+PC9hPiZuYnNwOyZuYnNwOyZuYnNwO1N0cmF0ZWd5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMi10MTkiPgotPHVsPgotPGxpPkF1dG88L2xpPgotPGxpPgotPHA+SWRlbnRpdHkgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIDxzcGFuIGNsYXNzPSJib2xkIj5JZGVudGl0eTwvc3Bhbj4gY29sdW1uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZXF1ZW5jZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBzZXF1ZW5jZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNGRkhFSCI+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L2E+KS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGUgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IGEgZGF0YWJhc2UgdGFibGUgKHNlZSA8YSBocmVmPSIjQ0FDR0ZFQUgiPlRhYmxlIEdlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMy10MTkiPkF1dG88L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQkFCRUVBSEoiIG5hbWU9IkJBQkVFQUhKIj48L2E+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yIE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOSByMWMyLXQxOSI+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB2YWx1ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+PGEgaWQ9IkNBQ0dGRUFIIiBuYW1lPSJDQUNHRkVBSCI+PC9hPlRhYmxlIEdlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE5IHIxYzItdDE5Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIHRoZSBkYXRhYmFzZSB0YWJsZSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleSBhbmQgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QFRhYmxlR2VuZXJhdG9yPC9jb2RlPiBhbm5vdGF0aW9uLgotPHA+VGhlc2UgZmllbGRzIGFwcGx5IG9ubHkgd2hlbiA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+Jm5ic3A7PSZuYnNwOzxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxOSByMWMyLXQxOSI+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOSByMWMyLXQxOSI+RGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ByaW1hcnkgS2V5IENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE5IHIxYzItdDE5Ij5UaGUgY29sdW1uIGluIHRoZSB0YWJsZSBnZW5lcmF0b3IncyA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtWYWx1ZSBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxOSByMWMyLXQxOSI+VGhlIGNvbHVtbiB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxOSByMWMyLXQxOSI+VGhlIHZhbHVlIGZvciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlByaW1hcnkgS2V5IENvbHVtbjwvc3Bhbj4gaW4gdGhlIGdlbmVyYXRvciB0YWJsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDRkZIRUgiIG5hbWU9IkNBQ0ZGSEVIIj48L2E+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTkgcjFjMi10MTkiPjxhIGlkPSJzdGhyZWYyNTEiIG5hbWU9InN0aHJlZjI1MSI+PC9hPjxhIGlkPSJzdGhyZWYyNTIiIG5hbWU9InN0aHJlZjI1MiI+PC9hPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIHNwZWNpZmljIHNlcXVlbmNlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AU2VxdWVuY2VHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0iYm9sZCI+U2VxdWVuY2U8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMmMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTkgcjFjMi10MTkiPk5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlIHRvIHVzZSBmb3IgZGVmaW5pbmcgcHJpbWFyeSBrZXkgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1NlcXVlbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgc2VxdWVuY2UuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjNWRhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJKSEJDSSIgbmFtZT0iQkFCSkhCQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNzEiIG5hbWU9InN0aHJlZjI3MSI+PC9hPjxhIGlkPSJzdGhyZWYyNzIiIG5hbWU9InN0aHJlZjI3MiI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkphdmEgUGVyc2lzdGVuY2U8L3NwYW4+IG9wdGlvbnMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9wZXJ0aWVzPC9zcGFuPiBwYWdlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzIHBhZ2U8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzYiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPjxhIGlkPSJzdGhyZWYyNzMiIG5hbWU9InN0aHJlZjI3MyI+PC9hPjxhIGlkPSJzdGhyZWYyNzQiIG5hbWU9InN0aHJlZjI3NCI+PC9hPjxhIGlkPSJzdGhyZWYyNzUiIG5hbWU9InN0aHJlZjI3NSI+PC9hPjxhIGlkPSJzdGhyZWYyNzYiIG5hbWU9InN0aHJlZjI3NiI+PC9hPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgdmVuZG9yLXNwZWNpZmljIHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPkxpYnJhcnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNiByMWMyLXQzNiI+U2VsZWN0IGEgc3BlY2lmaWMgSlBBIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5NYW5hZ2UgbGlicmFyaWVzPC9zcGFuPiB0byBjcmVhdGUgb3IgdXBkYXRlIGEgdXNlciBsaWJyYXJ5LjwvcD4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIGRvd25sb2FkIGEgc3BlY2lmaWMgbGlicmFyeSBjb25maWd1cmF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO1R5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2VyIExpYnJhcnk8L3NwYW4+IHRvIHNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdXNlci1kZWZpbmVkIG9yIGRvd25sb2FkZWQgbGlicmFyaWVzLgotPHA+SWYgeW91IHNlbGVjdCBEaXNhYmxlLCB5b3UgbXVzdCBtYW51YWxseSBpbmNsdWRlIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7SW5jbHVkZSZuYnNwO2xpYnJhcmllcyZuYnNwO3dpdGgmbmJzcDt0aGlzJm5ic3A7YXBwbGljYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzNiByMWMyLXQzNiI+U3BlY2lmeSBpZiB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIGFyZSBpbmNsdWRlZCB3aGVuIGRlcGxveWluZyB0aGUgYXBwbGljYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+PGEgaWQ9InN0aHJlZjI3NyIgbmFtZT0ic3RocmVmMjc3Ij48L2E+PGEgaWQ9InN0aHJlZjI3OCIgbmFtZT0ic3RocmVmMjc4Ij48L2E+PGEgaWQ9InN0aHJlZjI3OSIgbmFtZT0ic3RocmVmMjc5Ij48L2E+Q29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM2IHIxYzItdDM2Ij5UaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIG1hcCB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4KLTx1bD4KLTxsaT4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIENvbm5lY3Rpb25zPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+VG8gcmVjb25uZWN0IHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZWNvbm5lY3Q8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0Jm5ic3A7Y2F0YWxvZyZuYnNwO2Zyb20mbmJzcDtjb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzYgcjFjMi10MzYiPlNlbGVjdCBhIGNhdGFsb2cgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgY2F0YWxvZyBpcyBpbmNvcnJlY3Qgb3IgY2Fubm90IGJlIHVzZWQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0Jm5ic3A7c2NoZW1hJm5ic3A7ZnJvbSZuYnNwO2Nvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyBpbmNvcnJlY3Qgb3IgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPlBlcnNpc3RlbnQgQ2xhc3MgTWFuYWdlbWVudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDM2IHIxYzItdDM2Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDI0Lmh0bSNCQUJEQkNCSSI+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0VGFibGVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0VGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlOWNiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBUYWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUwWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlbGVjdCBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0dFRSIgbmFtZT0iQ0lBSENHRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBUYWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwMCIgbmFtZT0ic3RocmVmMjAwIj48L2E+PGEgaWQ9InN0aHJlZjIwMSIgbmFtZT0ic3RocmVmMjAxIj48L2E+PGEgaWQ9InN0aHJlZjIwMiIgbmFtZT0ic3RocmVmMjAyIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+U2VsZWN0IFRhYmxlczwvc3Bhbj4gZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBlbnRpdGllcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPlNlbGVjdCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBDb25uZWN0aW9uPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5TZWxlY3QgdGhlIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHdoaWNoIHRvIHNlbGVjdCB0YWJsZXMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEgc2VsZWN0aW9ucy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U3luY2hyb25pemUgQ2xhc3NlcyBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIGluY2x1ZGUgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1ZDFjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2VsZWN0IENhc2NhZGUgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkRHSUoiIG5hbWU9IkNJQUZER0lKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2gxPgotPHA+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGFzc29jaWF0aW9uOiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBSZW1vdmUsIG9yIFJlZnJlc2guPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl90YWJsZUFzc29jaWF0aW9ucy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NDJmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGFibGUgQXNzb2NpYXRpb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUYWJsZSBBc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDRElDQiIgbmFtZT0iQ0lBQ0RJQ0IiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlRhYmxlIEFzc29jaWF0aW9uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjAzIiBuYW1lPSJzdGhyZWYyMDMiPjwvYT5Vc2UgdGhpcyBwYWdlIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkYXRhYmFzZSB0YWJsZSBhbmQgZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFRhYmxlIEFzc29jaWF0aW9ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPlRhYmxlIGFzc29jaWF0aW9uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDkgcjFjMi10OSI+U2VsZWN0IGFuIGFzc29jaWF0aW9uIHRvIG1vZGlmeSBvciBjbGljayB0byBjcmVhdGUgYSBuZXcgdGFibGUgYXNzb2NpYXRpb24gd2l0aCB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT4gd2l6YXJkLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5HZW5lcmF0ZSB0aGlzIGFzc29jaWF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OSByMWMyLXQ5Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSB0aGUgc2VsZWN0ZWQgYXNzb2NpYXRpb24uIElmIGVuYWJsZWQsIHlvdSBjYW4gc3BlY2lmeSB0aGUgQ2FyZGluYWxpdHkgYW5kIEpvaW4gdGFibGUgZm9yIHRoZSB0YWJsZSBhc3NvY2lhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OSIgaGVhZGVycz0icjFjMS10OSI+R2VuZXJhdGUgYSByZWZlcmVuY2UgdG8gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1JPVyZndDs8L3NwYW4+IGluIDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRSZndDs8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OSByMWMyLXQ5Ij5TcGVjaWZ5IGlmIHRoZSBlbnRpdHkgc2hvdWxkIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLTxwPklmIGVuYWJsZWQsIHlvdSBjYW4gYWxzbyBlbnRlciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPiBuYW1lIGFuZCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DYXNjYWRlPC9zcGFuPiBtZXRob2QgKGFsbCwgcGVyc2lzdCwgbWVyZ2UsIHJlbW92ZSwgb3IgcmVmcmVzaCkgZm9yIHRoZSByZWZlcmVuY2UuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzNjOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlZmVyZW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4OCIgbmFtZT0ic3RocmVmMTg4Ij48L2E+PC9wPgotPGgxPlJlZmVyZW5jZTwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZGV0YWlsZWQgaGVscCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDEuaHRtI0NBQ0pKSkpIIj5XaXphcmRzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NBQ0RKSUlHIj5Qcm9wZXJ0eSBwYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI2Lmh0bSNDQUNERUlFRSI+UHJlZmVyZW5jZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jQ0FDR0VKREEiPkRpYWxvZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDQkJESUIiPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyNzdjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2l6YXJkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV2l6YXJkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0pKSkpIIiBuYW1lPSJDQUNKSkpKSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V2l6YXJkczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyB3aXphcmRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBR0hDR0EiPkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDE4YzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgRmlsZSBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJSkNDRSIgbmFtZT0iQ0lBSUpDQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2gxPgotPHA+VGhlIE1hcHBpbmcgRmlsZSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gYWRkIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyZWQgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LCB5b3UgY2FuIGxhdGVyIGFkZCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byB0aGUgc3JjIGZpbGUgb2YgdGhlIHByb2plY3QgdXNpbmcgdGhpcyB3aXphcmQuPC9wPgotPHA+VGhlIDxhIGhyZWY9IiNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4gY29uc2lzdHMgb2YgdGhlIE1hcHBpbmcgRmlsZSBwYWdlLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc0MjkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGluZyBGaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwaW5nIEZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFKRUlESiIgbmFtZT0iQ0lBSkVJREoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYxOTgiIG5hbWU9InN0aHJlZjE5OCI+PC9hPjxhIGlkPSJzdGhyZWYxOTkiIG5hbWU9InN0aHJlZjE5OSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+TWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJNYXBwaW5nIEZpbGUgV2l6YXJkIFByb3BlcnRpZXMiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIE1hcHBpbmcgRmlsZSBXaXphcmQuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+UHJvamVjdDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDcgcjFjMi10NyI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NyByMWMzLXQ3Ij4KLTxwPlNlbGVjdGVkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPlNvdXJjZSBmb2xkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzItdDciPgotPHA+VGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9qZWN0J3Mgc3JjIGZvbGRlci4gSWYgbmVlZGVkLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBwb2ludCB0aGUgd2l6YXJkIHRvIHRoZSBzcmMgZmlsZSdzIGxvY2F0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5GaWxlIFBhdGg8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ3IHIxYzItdDciPgotPHA+VGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWMzLXQ3Ij4KLTxwPlNlbGVjdGVkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPkRlZmF1bHQgQWNjZXNzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NyByMWMyLXQ3Ij4KLTxwPlNlbGVjdCB3aGV0aGVyIHRoZSBhY2Nlc3MgdG8gdGhlIGVudGl0eSBpcyBmaWVsZC1iYXNlZCBvciBwcm9wZXJ0eS1iYXNlZCwgYXMgZGVmaW5lZCBpbiBKUEEgc3BlY2lmaWNhdGlvbi48L3A+Ci08dWw+Ci08bGk+Ci08cD5Ob25lICZuZGFzaDsgTm8gYWNjZXNzIHR5cGUgc3BlY2lmaWVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHktYmFzZWQ8L3NwYW4+ICZuZGFzaDsgUGVyc2lzdGVudCBzdGF0ZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzLiBUaGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBtdXN0IGJlIDxzcGFuIGNsYXNzPSJib2xkIj5wdWJsaWM8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5wcml2YXRlPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkLWJhc2VkPC9zcGFuPiAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDcgcjFjMy10NyI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+QWRkIHRvIHBlcnNpc3RlbmNlIHVuaXQ8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ3IHIxYzItdDciPgotPHA+RGVzaWduYXRlcyB0aGUgcGVyc2lzdGVuY2UgdW5pdCBmb3IgdGhpcyBvYmplY3QgbWFwIGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NyByMWMzLXQ3Ij4KLTxwPlNlbGVjdGVkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZkZDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0ZSBUYWJsZXMgZnJvbSBFbnRpdGllcyBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdIQ0dBIiBuYW1lPSJDSUFHSENHQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGQ4M2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0eSBwYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RKSUlHIiBuYW1lPSJDQUNESklJRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvcGVydHkgcGFnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRhMGRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTBaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0NBR0dDIiBuYW1lPSJDQUNDQUdHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmFsIGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjE3JSIgLz4KLTxjb2wgd2lkdGg9IjI1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxMyI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10MTMiPkF2YWlsYWJsZSBmb3IgRW50aXR5Jm5ic3A7VHlwZTwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5NYXBwaW5nIFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMi10MTMiPkNsaWNraW5nIHRoZSBuYW1lIG9mIHRoZSBtYXBwaW5nIHR5cGUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBpbnZva2VzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gVXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZW50aXR5OiBNYXBwZWQgU3VwZXJjbGFzcywgRW1iZWRkYWJsZSBvciB0aGUgZGVmYXVsdCBtYXBwaW5nIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMy10MTMiPkVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNS5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4sIDxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4sIGFuZCA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMyLXQxMyI+VGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGVudGl0eSBuYW1lLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMyLXQxMyI+VGhlIGRlZmF1bHQgZGF0YWJhc2UgdGFibGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LiBUaGVzZSBmaWVsZHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGluZm9ybWF0aW9uIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPiBhcmVhLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5UaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBkYXRhYmFzZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO0NhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMyLXQxMyI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMzLXQxMyI+QXMgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMi10MTMiPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWMzLXQxMyI+QXMgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjJiZDQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSUpCR0giIG5hbWU9IkNBQ0lKQkdIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMTMiIG5hbWU9InN0aHJlZjIxMyI+PC9hPjxhIGlkPSJzdGhyZWYyMTQiIG5hbWU9InN0aHJlZjIxNCI+PC9hPjxhIGlkPSJzdGhyZWYyMTUiIG5hbWU9InN0aHJlZjIxNSI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGFyZWEgb2YgYW4gYXR0cmlidXRlLiBBdHRyaWJ1dGUgb3ZlcnJpZGVzIGdlbmVyYWxseSBvdmVycmlkZS9jb25maWd1cmUgYXR0cmlidXRlcyB0aGF0IGFyZSBpbmhlcml0ZWQgb3IgZW1iZWRkZWQuPC9wPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgQXR0cmlidXRlIG92ZXJyaWRlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjE3JSIgLz4KLTxjb2wgd2lkdGg9IjI1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNCI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10MTQiPkF2YWlsYWJsZSBmb3IgRW50aXR5Jm5ic3A7VHlwZTwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMi10MTQiPlNwZWNpZnkgYSBwcm9wZXJ0eSBvciBmaWVsZCB0byBiZSBvdmVycmlkZGVuIChmcm9tIHRoZSBkZWZhdWx0IG1hcHBpbmdzKS4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjNC10MTQiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzItdDE0Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjNC10MTQiPjxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTBhNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkhJREEiIG5hbWU9IkNBQ0JISURBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxNiIgbmFtZT0ic3RocmVmMjE2Ij48L2E+PGEgaWQ9InN0aHJlZjIxNyIgbmFtZT0ic3RocmVmMjE3Ij48L2E+PGEgaWQ9InN0aHJlZjIxOCIgbmFtZT0ic3RocmVmMjE4Ij48L2E+PGEgaWQ9InN0aHJlZjIxOSIgbmFtZT0ic3RocmVmMjE5Ij48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+U2Vjb25kYXJ5IFRhYmxlczwvc3Bhbj4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IHRvIGFzc29jaWF0ZSBhZGRpdGlvbmFsIHRhYmxlcyB3aXRoIGFuIGVudGl0eS4gVXNlIHRoaXMgYXJlYSBpZiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gZW50aXR5IGlzIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgdGFibGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYWQ2NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNGSEdIRSIgbmFtZT0iQ0FDRkhHSEUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMjAiIG5hbWU9InN0aHJlZjIyMCI+PC9hPjxhIGlkPSJzdGhyZWYyMjEiIG5hbWU9InN0aHJlZjIyMSI+PC9hPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5TdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZ5IHRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBtYXBwaW5nIGEgY2xhc3Mgb3IgY2xhc3MgaGllcmFyY2h5OgotPHVsPgotPGxpPgotPHA+U2luZ2xlIHRhYmxlICZuZGFzaDsgQWxsIGNsYXNzZXMgaW4gdGhlIGhpZXJhcmNoeSBhcmUgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Kb2luZWQgJm5kYXNoOyBUaGUgcm9vdCBvZiB0aGUgaGllcmFyY2h5IGlzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZTsgZWFjaCBjaGlsZCBtYXBzIHRvIGl0cyBvd24gdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlIHBlciBjbGFzcyAmbmRhc2g7IEVhY2ggY2xhc3MgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgdGFibGUuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASW5oZXJpdGFuY2U8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMy10MTUiPlNpbmdsZSB0YWJsZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPjxhIGlkPSJzdGhyZWYyMjIiIG5hbWU9InN0aHJlZjIyMiI+PC9hPjxhIGlkPSJzdGhyZWYyMjMiIG5hbWU9InN0aHJlZjIyMyI+PC9hPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNSByMWMyLXQxNSI+U3BlY2lmeSB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYW4gZW50aXR5IGluIHRoaXMgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBUaGUgdmFsdWUgbXVzdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVHlwZTwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPjxhIGlkPSJzdGhyZWYyMjQiIG5hbWU9InN0aHJlZjIyNCI+PC9hPjxhIGlkPSJzdGhyZWYyMjUiIG5hbWU9InN0aHJlZjIyNSI+PC9hPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTUgcjFjMi10MTUiPlRoZXNlIGZpZWxkcyBhcmUgYXZhaWxhYmxlIHdoZW4gdXNpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2luZ2xlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbmVkPC9zcGFuPiBpbmhlcml0YW5jZSBzdHJhdGVneS4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRldGFpbHM8L3NwYW4+IGFyZWEgdG8gZGVmaW5lIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+TGVuZ3RoPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbHVtbiBkZWZpbml0aW9uPC9zcGFuPiBvZiB0aGlzIERpc2NyaW1pbmF0b3IgQ29sdW1uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTUgcjFjMi10MTUiPk5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPiZuYnNwOyZuYnNwO1R5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNSByMWMyLXQxNSI+U2V0IHRoaXMgZmllbGQgdG8gc2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gPGNvZGU+Q2hhcjwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4gKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IDxjb2RlPlN0cmluZzwvY29kZT4pLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3NwYW4+IG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTUgcjFjMy10MTUiPlN0cmluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE1IHIxYzItdDE1Ij5Vc2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIHNlbGVjdCBuZXcgSm9pbiBDb2x1bW4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHdpdGggQFByaW1hcnlLZXlKb2luQ29sdW1uIGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZmFkODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjIyNiIgbmFtZT0ic3RocmVmMjI2Ij48L2E+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5Vc2UgdGhlIHF1ZXJpZXMgYXJlYSBvZiB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjcmVhdGUgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuIFJlZmVyIHRvIDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJJR0JHRyI+IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5MmM1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JBRUJDIiBuYW1lPSJDQUNCQUVCQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvaDE+Ci08cD5Vc2UgYXJlYSB0byBzcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Kb2luIFRhYmxlPC9zcGFuPiBhcmVhIGluIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj50aGUgSlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+IG1hcHBpbmcgdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij48YSBpZD0iQ0FDQkJERkciIG5hbWU9IkNBQ0JCREZHIj48L2E+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMi10MTciPjxhIGlkPSJzdGhyZWYyNDQiIG5hbWU9InN0aHJlZjI0NCI+PC9hPjxhIGlkPSJzdGhyZWYyNDUiIG5hbWU9InN0aHJlZjI0NSI+PC9hPlNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEpvaW5Db2x1bTwvY29kZT4gYXR0cmlidXRlLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzMtdDE3Ij5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5JbnZlcnNlIEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE3IHIxYzItdDE3Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhjMjg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZDRUpDIiBuYW1lPSJDQUNGQ0VKQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNDYiIG5hbWU9InN0aHJlZjI0NiI+PC9hPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Kb2luIFRhYmxlPC9zcGFuPiBhcmVhIGluIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPiBhbmQgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+IG1hcHBpbmcgdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij5Kb2luIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzItdDE4Ij48YSBpZD0ic3RocmVmMjQ3IiBuYW1lPSJzdGhyZWYyNDciPjwvYT48YSBpZD0ic3RocmVmMjQ4IiBuYW1lPSJzdGhyZWYyNDgiPjwvYT5TcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBKb2luQ29sdW08L2NvZGU+IGF0dHJpYnV0ZS4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMzLXQxOCI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDI4Lmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYzc4YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUNHSCIgbmFtZT0iQ0FDQ0FDR0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjAiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5QYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjAgcjFjMi10MjAiPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgcGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMi10MjAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcHJvamVjdDoKLTx1bD4KLTxsaT4KLTxwPlByb3BlcnR5PC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7YWNjZXNzJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5NWIzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNFQUdCRyIgbmFtZT0iQ0FDRUFHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuIFRoZXNlIGZpZWxkcyBhcmUgY29udGFpbmVkIGluIHRoZSA8Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjEiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5YTUwgTWFwcGluZyBEYXRhIENvbXBsZXRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMi10MjEiPlNwZWNpZmllcyB0aGF0IHRoZSBKYXZhIGNsYXNzZXMgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0IGFyZSBmdWxseSBzcGVjaWZpZWQgYnkgdGhlaXIgbWV0YWRhdGEuIEFueSBhbm5vdGF0aW9ucyB3aWxsIGJlIGlnbm9yZWQuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7eG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMi10MjEiPlNwZWNpZnkgaG93IHRoZSBlbnRpdHkgaXRzIGFjY2VzcyBpbnN0YW5jZSB2YXJpYWJsZXMuCi08dWw+Ci08bGk+Ci08cD5Qcm9wZXJ0eSAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMy10MjEiPlByb3BlcnR5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+Q2FzY2FkZSBQZXJzaXN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMi10MjEiPkFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2Nhc2NhZGUtcGVyc2lzdCZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDU5Y2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRvcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRvcnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGR0FJSiIgbmFtZT0iQ0lBRkdBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRvcnM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhdG9yIGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMiIgaGVhZGVycz0icjFjMS10MjIiPkdlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIyIHIxYzItdDIyIj5EaXNwbGF5cyB0aGUgZXhpc3RpbmcgU2VxdWVuY2UgYW5kIFRhYmxlIGdlbmVyYXRvcnMuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIFNlcXVlbmNlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIFRhYmxlPC9zcGFuPiB0byBhZGQgYSBuZXcgZ2VuZXJhdG9yLjwvcD4KLTxwPkZvciBzZXF1ZW5jZSBnZW5lcmF0b3JzLCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgdGFibGUgZ2VuZXJhdG9ycywgeW91IG11c3QgY29tcGxldGUgdGhlIGZvbGxvd2luZyBmaWVsZHM6PC9wPgotPHVsPgotPGxpPgotPHA+TmFtZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleSBjb2x1bW48L3A+Ci08L2xpPgotPGxpPgotPHA+VmFsdWUgY29sdW1uPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5IGNvbHVtbiB2YWx1ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWQ3NmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJQkFBSiIgbmFtZT0iQ0lBSUJBQUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlF1ZXJpZXM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgUXVlcnkgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+UXVlcmllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzItdDIzIj5EaXNwbGF5cyB0aGUgZXhpc3RpbmcgTmFtZWQgYW5kIE5hdGl2ZSBxdWVyaWVzLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gYWRkIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPHA+Rm9yIG5hbWVkIHF1ZXJpZXMsIGVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPHA+Rm9yIG5hdGl2ZSBxdWVyaWVzLCBzZWxlY3QgYSByZXN1bHQgY2xhc3MsIHRoZW4gZW50ZXIgdGhlIHF1ZXJ5IGluIHRoZSBRdWVyeSBmaWVsZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5RdWVyeSBIaW50czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIzIHIxYzItdDIzIj5EaXNwbGF5cyB0aGUgZXhpc3RpbmcgcXVlcnkgaGludHMgKE5hbWUgYW5kIFZhbHVlKS4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGFkZCBhIG5ldyBxdWVyeSBoaW50LjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzA3ODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnRlcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRlcnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFER0NJRCIgbmFtZT0iQ0lBREdDSUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbnZlcnRlcnM8L2gxPgotPHA+VGhlIENvbnZlcnRlcnMgaW5mb3JtYXRpb24gaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcgYXBwbGllcyBvbmx5IHdoZW4gdXNpbmcgRWNsaXBzZUxpbms8L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY29udmVydGVyLCB1c2luZyB0aGUgPGEgaHJlZj0icmVmX2FkZF9jb252ZXJ0ZXIuaHRtI0NJQUdDR0lKIj5BZGQgQ29udmVydGVyIGRpYWxvZzwvYT4uPC9wPgotPHA+Jm5ic3A7PC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDY4MTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29ubmVjdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29ubmVjdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZGSklFIiBuYW1lPSJDSUFGRkpJRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29ubmVjdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ29ubmVjdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNTgiIG5hbWU9InN0aHJlZjI1OCI+PC9hPjxhIGlkPSJzdGhyZWYyNTkiIG5hbWU9InN0aHJlZjI1OSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ29ubmVjdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDb25uZWN0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yJnJzcXVvO3MgY29ubmVjdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+VHJhbnNhY3Rpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgaWYgdGhlIGNvbm5lY3Rpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCB1c2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0PC9zcGFuPiAtLSBTZWxlY3QgdG8gdXNlIHRoZSBjb250YWluZXIgdXNlZCBieSB0aGUgY29udGFpbmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIC0tIFRyYW5zYWN0aW9ucyBvZiB0aGUgSmF2YSBFRSBzZXJ2ZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5SZXNvdXJjZSBMb2NhbDwvc3Bhbj4gLS0gTmF0aXZlIGFjdGlvbnMgb2YgYSBKREJDIGRyaXZlciB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPkJhdGNoIFdyaXRpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+Ci08cD5TcGVjaWZ5IHRoZSB1c2Ugb2YgYmF0Y2ggd3JpdGluZyB0byBvcHRpbWl6ZSB0cmFuc2FjdGlvbnMgd2l0aCBtdWx0aXBsZSB3cml0ZSBvcGVyYXRpb25zLjwvcD4KLTxwPlNldCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpbnRvIHRoZSBzZXNzaW9uIGF0IGRlcGxveW1lbnQgdGltZS48L3A+Ci08cD5Ob3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgd2hlbiB1c2VkIGJvdGggaW4gYSBKYXZhIFNFIGFuZCBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIG9yYWNsZS50b3BsaW5rLmNvbmZpZy5CYXRjaFdyaXRpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBKREJDIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5CdWZmZXJlZDwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBlaXRoZXIgSkRCQyBiYXRjaCB3cml0aW5nIG5vciBuYXRpdmUgcGxhdGZvcm0gYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9yYWNsZUpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBib3RoIEpEQkMgYmF0Y2ggd3JpdGluZyBhbmQgT3JhY2xlIG5hdGl2ZSBwbGF0Zm9ybSBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBiYXRjaCB3cml0aW5nICh0dXJuIGl0IG9mZikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5TdGF0ZW1lbnQgY2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5OYXRpdmUgU1FMPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzMtdDI1Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiBhcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiBlbnRlciB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBKVEEgZGF0YSBzb3VyY2UgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPk5vbi1KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGFzIHRoZSB0cmFuc2FjdGlvbiB0eXBlLCB0aGVuIGVudGVyIHRoZSBuYW1lIG9mIHRoZSBub24tSlRBIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+Jm5ic3A7Jm5ic3A7QmluZCZuYnNwO1BhcmFtZXRlcnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNSByMWMyLXQyNSI+Ci08cD5Db250cm9sIHdoZXRoZXIgb3Igbm90IHRoZSBxdWVyeSB1c2VzIHBhcmFtZXRlciBiaW5kaW5nLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvcGVydHkgYXBwbGllcyB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+RWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjUgcjFjMi10MjUiPgotPHA+RGVmaW5lIHRoZSBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBVUkwsIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90ZSBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtSZWFkJm5ic3A7Q29ubmVjdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNSByMWMyLXQyNSI+Ci08cD5UaGUgbWF4aW11bSBhbmQgbWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBpbiB0aGUgSkRCQyByZWFkIGNvbm5lY3Rpb24gcG9vbC48L3A+Ci08cD5Ob3RlOiBUaGVzZSBwcm9wZXJ0eSBhcHBseSB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZXNlIHByb3BlcnRpZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtXcml0ZSZuYnNwO0Nvbm5lY3Rpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjUgcjFjMi10MjUiPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc2UgcHJvcGVydHkgYXBwbHkgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEzMmQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXphdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3VzdG9taXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUpBRkVHIiBuYW1lPSJDSUFKQUZFRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXphdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ3VzdG9taXphdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjAiIG5hbWU9InN0aHJlZjI2MCI+PC9hPjxhIGlkPSJzdGhyZWYyNjEiIG5hbWU9InN0aHJlZjI2MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ3VzdG9taXphdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3ImcnNxdW87cyBDdXN0b21pemF0aW9uIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMi10MjYiPgotPHA+U3BlY2lmaWVzIGlmIHdlYXZpbmcgb2YgdGhlIGVudGl0eSBjbGFzc2VzIGlzIHBlcmZvcm1lZC4gVGhlIEVjbGlwc2VMaW5rIEpQQSBwZXJzaXN0ZW5jZSBwcm92aWRlciB1c2VzIHdlYXZpbmcgdG8gZW5oYW5jZSBKUEEgZW50aXRpZXMgZm9yIHN1Y2ggcHJvcGVydGllcyBhcyBsYXp5IGxvYWRpbmcsIGNoYW5nZSB0cmFja2luZywgZmV0Y2ggZ3JvdXBzLCBhbmQgaW50ZXJuYWwgb3B0aW1pemF0aW9ucy4gU2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBvcHRpb25zOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5ObyBXZWF2aW5nPC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2VhdmUgRHluYW1pY2FsbHk8L3NwYW4+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWF2ZSBTdGF0aWNhbGx5PC9zcGFuPiAtLSBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHBsYW4gdG8gZXhlY3V0ZSB5b3VyIGFwcGxpY2F0aW9uIG91dHNpZGUgb2YgYSBKYXZhIEVFIDUgY29udGFpbmVyIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3QgcGVybWl0IHRoZSB1c2Ugb2YgPGNvZGU+LWphdmFhZ2VudDplY2xpcHNlbGluay5qYXI8L2NvZGU+IG9uIHRoZSBKVk0gY29tbWFuZCBsaW5lLiBUaGlzIGFzc3VtZXMgdGhhdCBjbGFzc2VzIGhhdmUgYWxyZWFkeSBiZWVuIHN0YXRpY2FsbHkgd292ZW4uIFJ1biB0aGUgc3RhdGljIHdlYXZlciBvbiB0aGUgY2xhc3NlcyBiZWZvcmUgZGVwbG95aW5nIHRoZW0uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMzLXQyNiI+Ci08cD5XZWF2ZSBEeW5hbWljYWxseTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+Jm5ic3A7Jm5ic3A7V2VhdmluZyZuYnNwO0xhenk8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGxhenkgd2VhdmluZy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7RmV0Y2gmbmJzcDtHcm91cHM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGZldGNoIGdyb3VwcyB0aHJvdWdoIHdlYXZpbmcuIFNldCB0aGlzIG9wdGlvbiB0byBmYWxzZSBpZjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5UaGVyZSBpcyBubyB3ZWF2aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGFzc2VzIHNob3VsZCBub3QgYmUgY2hhbmdlZCBkdXJpbmcgd2VhdmluZyAoZm9yIGV4YW1wbGUsIHdoZW4gZGVidWdnaW5nKS48L3A+Ci08L2xpPgotPC91bD4KLTxwPlNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIGZvciBwbGF0Zm9ybXMgd2hlcmUgaXQgaXMgbm90IHN1cHBvcnRlZC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nJm5ic3A7aW50ZXJuYWw8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjYgcjFjMy10MjYiPgotPHA+VHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+V2VhdmluZyZuYnNwO2VhZ2VyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjYgcjFjMi10MjYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7Q2hhbmdlJm5ic3A7VHJhY2tpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIHdlYXZpbmcgdG8gZGV0ZWN0IHdoaWNoIGZpZWxkcyBvciBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgY2hhbmdlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1Rocm93Jm5ic3A7RXhjZXB0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBzZXQgRWNsaXBzZUxpbmsgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9yIGxvZyBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgcHJvYmxlbSB3aXRoIGFueSBvZiB0aGUgZmlsZXMgbGlzdGVkIGluIGEgPHNwYW4gY2xhc3M9ImJvbGQiPnBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZSA8Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5FeGNlcHRpb24gaGFuZGxlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCAob3IgY3JlYXRlKSBhIEphdmEgY2xhc3MgdG8gaGFuZGxlIGV4Y3BldGlvbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPlNlc3Npb24gQ3VzdG9taXplcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgYSBzZXNzaW9uIGN1c3RvbWl6ZXIgY2xhc3M6IGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnRvb2xzLnNlc3Npb25jb25maWd1cmF0aW9uLlNlc3Npb25DdXN0b21pemVyPC9jb2RlPiBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGEgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuIFVzZSB0aGlzIGNsYXNzJyA8Y29kZT5jdXN0b21pemU8L2NvZGU+IG1ldGhvZCwgd2hpY2ggdGFrZXMgYW4gPGNvZGU+ZWNsaXBzZWxpbmsuc2Vzc2lvbnMuU2Vzc2lvbjwvY29kZT4sIHRvIHByb2dyYW1tYXRpY2FsbHkgYWNjZXNzIGFkdmFuY2VkIEVjbGlwc2VMaW5rIHNlc3Npb24gQVBJLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNiByMWMzLXQyNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+RGVzY3JpcHRvciBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCBhbiBFY2xpcHNlTGluayBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MmbmRhc2g7YSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsudG9vbHMuc2Vzc2lvbmNvbmZpZ3VyYXRpb24uRGVzY3JpcHRvckN1c3RvbWl6ZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4gVXNlIHRoaXMgY2xhc3MncyA8Y29kZT5jdXN0b21pemU8L2NvZGU+IG1ldGhvZCwgd2hpY2ggdGFrZXMgYW4gPGNvZGU+ZWNsaXBzZWxpbmsuZGVzY3JpcHRvcnMuQ2xhc3NEZXNjcmlwdG9yPC9jb2RlPiwgdG8gcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3MgYWR2YW5jZWQgRWNsaXBzZUxpbmsgZGVzY3JpcHRvciBhbmQgbWFwcGluZyBBUEkgZm9yIHRoZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgSlBBIGVudGl0eSBuYW1lZCA8Y29kZT4mbHQ7RU5USVRZJmd0OzwvY29kZT4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDI2IHIxYzMtdDI2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5WYWxpZGF0aW9uIG9ubHk8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MjYgcjFjMi10MjYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+UHJvZmlsZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MjYgcjFjMi10MjYiPgotPHVsPgotPGxpPgotPHA+Tm8gUHJvZmlsZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyZm9ybWFuY2UgUHJvZmlsZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+UXVlcnkgTW9uaXRvcjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPk5vUHJvZmlsZXI8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNmM5NzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DYWNoaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDYWNoaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQkVEQ0giIG5hbWU9IkNJQUJFRENIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjYyIiBuYW1lPSJzdGhyZWYyNjIiPjwvYT5DYWNoaW5nPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjYzIiBuYW1lPSJzdGhyZWYyNjMiPjwvYT48YSBpZD0ic3RocmVmMjY0IiBuYW1lPSJzdGhyZWYyNjQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgQ2FjaGluZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwmcnNxdW87cyBDYWNoaW5nIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5EZWZhdWx0IENhY2hlIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgYXMgdGhlIERlZmF1bHQgQ2FjaGUgVHlwZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U29mdCB3aXRoIFdlYWsgU3ViY2FjaGU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPldlYWsgd2l0aCBIYXJkIFN1YmNhY2hlPC9zcGFuPiBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBzdWJjYWNoZSB0aGF0IHVzZXMgc29mdCByZWZlcmVuY2VzLiBUaGUgc2l6ZSBvZiB0aGUgc3ViY2FjaGUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAuIFRoZSBzdWJjYWNoZSB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZSBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS48L3A+Ci08cD5Vc2UgdGhpcyBpZGVudGl0eSBtYXAgaW4gbW9zdCBjaXJjdW1zdGFuY2VzIGFzIGEgbWVhbnMgdG8gY29udHJvbCBtZW1vcnkgdXNlZCBieSB0aGUgY2FjaGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWVrIHdpdGggSGFyZCBTdWJjYWNoZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+U29mdCB3aXRoIFdlYWs8L3NwYW4+IHN1YmNhY2hlIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhIG1vc3QgZnJlcXVlbnRseSB1c2VkIHN1YmNhY2hlIHRoYXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMuIFVzZSB0aGlzIGlkZW50aXR5IG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgeW91ciBwbGF0Zm9ybS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYWs8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+LCBleGNlcHQgdGhhdCBvYmplY3RzIGFyZSByZWZlcmVuY2VkIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBvcHRpb24gdXNlcyBsZXNzIG1lbW9yeSB0aGFuIDxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiwgYWxsb3dzIGNvbXBsZXRlIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LjwvcD4KLTxwPlVzZSB0aGlzIGlkZW50aXR5IG1hcCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQsIG9uY2Ugc3RhcnRlZCwgc3RheSBvbiB0aGUgc2VydmVyIHNpZGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Tb2Z0PC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5XZWFrPC9zcGFuPiBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZSBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBpZGVudGl0eSBtYXAgZW5hYmxlcyBmdWxsIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cuIEl0IHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eTogYWxsIG9iamVjdHMgYXJlIGNhY2hlZCBhbmQgbm90IHJlbW92ZWQuPC9wPgotPHA+Tm90ZTogVGhpcyBwcm9jZXNzIG1heSBiZSBtZW1vcnktaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSByZWFkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gZG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSBvYmplY3RzLlRoaXMgb3B0aW9uIGlzIG5vdCByZWNvbW1lbmRlZC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzMtdDI4Ij4KLTxwPldlYWsgd2l0aCBoYXJkIHN1YmNhY2hlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5EZWZhdWx0IENhY2hlIFNpemU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyOCByMWMyLXQyOCI+Ci08cD5TZXQgdGhlIHNpemUgKG1heGltdW0gbnVtYmVyIG9mIG9iamVjdHMpIG9mIHRoZSBjYWNoZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyOCByMWMzLXQyOCI+Ci08cD4xMDA8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkRlZmF1bHQgU2hhcmVkIENhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjggcjFjMi10MjgiPgotPHA+U3BlY2lmaWVzIGlmIGNhY2hlZCBpbnN0YW5jZXMgc2hvdWxkIGJlIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgaW4gYSBjbGllbnQgaXNvbGF0ZWQgY2FjaGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjggcjFjMy10MjgiPgotPHA+VHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RW50aXR5IENhY2hpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyOCByMWMyLXQyOCI+Ci08cD5TcGVjaWZ5IHRoZSBlbnRpdHktc3BlY2lmaWMgY2FjaGluZyBpbmZvcm1hdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyOCByMWMzLXQyOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD4mbmJzcDsmbmJzcDtDYWNoZSZuYnNwO1R5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+RGVmYXVsdCBDYWNoZSBUeXBlLjwvc3Bhbj48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyOCByMWMzLXQyOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD4mbmJzcDsmbmJzcDtDYWNoZSZuYnNwO1NpemU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+RGVmYXVsdCBDYWNoZSBTaXplLjwvc3Bhbj48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyOCByMWMzLXQyOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD4mbmJzcDsmbmJzcDtTaGFyZWQmbmJzcDtDYWNoZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNlZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5EZWZhdWx0IFNoYXJlZCBDYWNoZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Rmx1c2ggY2xlYXIgY2FjaGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgYXMgdGhlIERlZmF1bHQgQ2FjaGUgVHlwZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RHJvcDwvc3Bhbj4gJm5kYXNoOyBUaGlzIG1vZGUgaXMgdGhlIGZhc3Rlc3QgYW5kIHVzZXMgdGhlIGxlYXN0IG1lbW9yeS4gSG93ZXZlciwgYWZ0ZXIgY29tbWl0IHRoZSBzaGFyZWQgY2FjaGUgbWlnaHQgcG90ZW50aWFsbHkgY29udGFpbiBzdGFsZSBkYXRhLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RHJvcCBJbnZhbGlkYXRlPC9zcGFuPiAmbmRhc2g7IENsYXNzZXMgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSBvYmplY3QgdXBkYXRlZCBvciBkZWxldGVkIGFyZSBpbnZhbGlkYXRlZCBpbiB0aGUgc2hhcmVkIGNhY2hlIGF0IGNvbW1pdCB0aW1lLiBUaGlzIG1vZGUgaXMgc2xvd2VyIHRoYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkRyb3A8L3NwYW4+LCBidXQgYXMgZWZmaWNpZW50IG1lbW9yeSB1c2FnZS13aXNlLCBhbmQgcHJldmVudHMgc3RhbGUgZGF0YS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk1lcmdlPC9zcGFuPiAmbmRhc2g7IERyb3AgY2xhc3NlcyBmcm9tIHRoZSBFbnRpdHlNYW5hZ2VyJ3MgY2FjaGUgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgbm90IGJlZW4gZmx1c2hlZC4gVGhpcyBtb2RlIGxlYXZlcyB0aGUgc2hhcmVkIGNhY2hlIGluIGEgcGVyZmVjdCBzdGF0ZSBhZnRlciBjb21taXQuIEhvd2V2ZXIsIGl0IGlzIHRoZSBsZWFzdCBtZW1vcnktZWZmaWNpZW50IG1vZGU7IHRoZSBtZW1vcnkgbWlnaHQgZXZlbiBydW4gb3V0IGluIGEgdmVyeSBsYXJnZSB0cmFuc2FjdGlvbi48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI4IHIxYzMtdDI4Ij4KLTxwPkRyb3AgSW52YWxpZGF0ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmZWVkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkxvZ2dpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkxvZ2dpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCR0hISSIgbmFtZT0iQ0lBQkdISEkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkxvZ2dpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY1IiBuYW1lPSJzdGhyZWYyNjUiPjwvYT48YSBpZD0ic3RocmVmMjY2IiBuYW1lPSJzdGhyZWYyNjYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MzEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnaW5nIExldmVsPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzEgcjFjMi10MzEiPgotPHA+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsIChpbiBhc2NlbmRpbmcgb3JkZXIgb2YgaW5mb3JtYXRpb24pOjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT46PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9GRjwvc3Bhbj4mbmRhc2g7ZGlzYWJsZXMgbG9nZ2luZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U0VWRVJFPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBUb3BMaW5rIGNhbm5vdCBjb250aW51ZSwgYXMgd2VsbCBhcyBhbnkgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZHVyaW5nIGxvZ2luLiBUaGlzIGluY2x1ZGVzIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XQVJOSU5HPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgdGhhdCBkbyBub3QgZm9yY2UgVG9wTGluayB0byBzdG9wLCBpbmNsdWRpbmcgYWxsIGV4Y2VwdGlvbnMgbm90IGxvZ2dlZCB3aXRoIHNldmVyZSBsZXZlbC4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5JTkZPPC9zcGFuPiZuZGFzaDtsb2dzIHRoZSBsb2dpbi9sb2dvdXQgcGVyIHNldmVyIHNlc3Npb24sIGluY2x1ZGluZyB0aGUgdXNlciBuYW1lLiBBZnRlciBhY3F1aXJpbmcgdGhlIHNlc3Npb24sIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIGxvZ2dlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNPTkZJRzwvc3Bhbj4mbmRhc2g7bG9ncyBvbmx5IGxvZ2luLCBKREJDIGNvbm5lY3Rpb24sIGFuZCBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkU8L3NwYW4+Jm5kYXNoO2xvZ3MgU1FMLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORVI8L3NwYW4+Jm5kYXNoO3NpbWlsYXIgdG8gd2FybmluZy4gSW5jbHVkZXMgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FU1Q8L3NwYW4+Jm5kYXNoO2luY2x1ZGVzIGFkZGl0aW9uYWwgbG93IGxldmVsIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbCIgdmFsdWU9IklORk8iLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMxIHIxYzMtdDMxIj4KLTxwPkluZm88L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RpbWVzdGFtcDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgdGltZXN0YW1wIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aW1lc3RhbXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIHRpbWVzdGFtcC48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcudGltZXN0YW1wIiB2YWx1ZT0iZmFsc2UiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzMtdDMxIj4KLTxwPnRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RocmVhZDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciBhIHRocmVhZCBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aHJlYWQgaWRlbnRpZmllci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgdGhyZWFkIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMSByMWMzLXQzMSI+Ci08cD50cnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD4mbmJzcDsmbmJzcDtTZXNzaW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMi10MzEiPgotPHA+Q29udHJvbCB3aGV0aGVyIGFuIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb24iIHZhbHVlPSJmYWxzZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMy10MzEiPgotPHA+dHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+Jm5ic3A7Jm5ic3A7RXhjZXB0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIEVjbGlwc2VMaW5rIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGFsbCBleGNlcHRpb25zLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzMtdDMxIj4KLTxwPmZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2cgZmlsZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMxIHIxYzItdDMxIj4KLTxwPlNwZWNpZnkgYSBmaWxlIGxvY2F0aW9uIGZvciB0aGUgbG9nIG91dHB1dCAoaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgb3V0KS48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmZpbGUiIHZhbHVlPSJDOlxteW91dFwiIC8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMSByMWMzLXQzMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMSByMWMyLXQzMSI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgbG9nZ2VyIHRvIHVzZTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0TG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgRWNsaXBzZUxpbmsgbmF0aXZlIGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLkRlZmF1bHRTZXNzaW9uTG9nPC9jb2RlPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkphdmFMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuSmF2YUxvZzwvY29kZT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZXJ2ZXJMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLnBsYXRmb3JtLnNlcnZlci5TZXJ2ZXJMb2c8L2NvZGU+LiBJbnRlZ3JhdGVzIHdpdGggdGhlIGFwcGxpY2F0aW9uIHNlcnZlcidzIGxvZ2dpbmcgYXMgZGVmaW5lIGluIHRoZSA8Y29kZT5lY2xpcHNlbGluay5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyUGxhdGZvcm0uPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSBsb2dnZXIuIFRoZSBjdXN0b20gbG9nZ2VyIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLlNlc3Npb25Mb2c8L2NvZGU+IGludGVyZmFjZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIiB2YWx1ZT0iYWNtZS5sb2dnZXJzLk15Q3VzdG9tTG9nZ2VyIiAvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzEgcjFjMy10MzEiPgotPHA+RGVmYXVsdExvZ2dlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNGRhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSkNIRSIgbmFtZT0iQ0lBRkpDSEUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk9wdGlvbnM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY3IiBuYW1lPSJzdGhyZWYyNjciPjwvYT48YSBpZD0ic3RocmVmMjY4IiBuYW1lPSJzdGhyZWYyNjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlIiBzdW1tYXJ5PSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDMzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPlNlc3Npb24gTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgdGhlIG5hbWUgYnkgd2hpY2ggdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gaXMgc3RvcmVkIGluIHRoZSBzdGF0aWMgc2Vzc2lvbiBtYW5hZ2VyLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBFY2xpcHNlTGluayBzaGFyZWQgc2Vzc2lvbiBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBKUEEgb3IgdG8gdXNlIGEgcHJlLWV4aXN0aW5nIEVjbGlwc2VMaW5rIHNlc3Npb24gY29uZmlndXJlZCB0aHJvdWdoIGEgRWNsaXBzZUxpbmsgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBhIHZhbGlkIEVjbGlwc2VMaW5rIHNlc3Npb24gbmFtZSB0aGF0IGlzIHVuaXF1ZSBpbiBhIHNlcnZlciBkZXBsb3ltZW50LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSIgdmFsdWU9Ik15U2Vzc2lvbiIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+U2Vzc2lvbnMgWE1MPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgKDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4pLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIGFzIGFuIGFsdGVybmF0aXZlIHRvIGFubm90YXRpb25zIGFuZCBkZXBsb3ltZW50IFhNTC4gSWYgeW91IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSwgRWNsaXBzZUxpbmsgd2lsbCBvdmVycmlkZSBhbGwgY2xhc3MgYW5ub3RhdGlvbiBhbmQgdGhlIG9iamVjdCByZWxhdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiwgYXMgd2VsbCBhcyA8Y29kZT5PUk0ueG1sPC9jb2RlPiBhbmQgb3RoZXIgbWFwcGluZyBmaWxlcywgaWYgcHJlc2VudC48L3A+Ci08cD5JbmRpY2F0ZSB0aGUgc2Vzc2lvbiBieSBzZXR0aW5nIHRoZSA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9uLW5hbWU8L2NvZGU+IHByb3BlcnR5LjwvcD4KLTxwPk5vdGU6IElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHksIDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4gZmlsZSB3aWxsIG5vdCBiZSB1c2VkLjwvcD4KLTxwPlZhbGlkIHZhbHVlczogdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIHNlc3Npb25zIFhNTCBmaWxlLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9InRvcGxpbmsuc2Vzc2lvbi14bWwiIHZhbHVlPSJteXNlc3Npb24ueG1sIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgRGF0YWJhc2U8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMyLXQzMyI+Ci08cD5TZWxlY3QgdGhlIHRhcmdldCBkYXRhYmFzZS4gWW91IGNhbiBhbHNvIHNldCB0aGUgdmFsdWUgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgYSBzdWJjbGFzcyBvZiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uRGF0YWJhc2VQbGF0Zm9ybSBjbGFzczwvY29kZT4uPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGFyZ2V0LWRhdGFiYXNlIiB2YWx1ZT0iT3JhY2xlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMzLXQzMyI+Ci08cD5BdXRvPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgU2VydmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzMgcjFjMi10MzMiPgotPHA+U2VsZWN0IHRoZSB0YXJnZXQgc2VydmVyIGZvciB5b3VyIEpQQSBhcHBsaWNhdGlvbi48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIiB2YWx1ZT0iT0M0Sl8xMF8xXzMiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMzIHIxYzMtdDMzIj4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPkV2ZW50IExpc3RlbmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBhIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgdG8gYmUgYWRkZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb25zLlNlc3Npb25FdmVudExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciIgdmFsdWU9Im15cGFja2FnZS5NeUNsYXNzLmNsYXNzIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5JbmNsdWRlIERlc2NyaXB0b3IgUXVlcmllczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzItdDMzIj4KLTxwPkVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWZhdWx0IGNvcHlpbmcgb2YgYWxsIG5hbWVkIHF1ZXJpZXMgZnJvbSB0aGUgZGVzY3JpcHRvcnMgdG8gdGhlIHNlc3Npb24uIFRoZXNlIHF1ZXJpZXMgaW5jbHVkZSB0aGUgb25lcyBkZWZpbmVkIHVzaW5nIEVjbGlwc2VMaW5rIEFQSSwgZGVzY3JpcHRvciBhbWVuZG1lbnQgbWV0aG9kcywgYW5kIHNvIG9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPk1pc2NlbGxhbmVvdXMgT3B0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDMzIHIxYzItdDMzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD4mbmJzcDsmbmJzcDtUZW1wb3JhbCBtdXRhYmxlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBpZiBhbGwgPGNvZGU+RGF0ZTwvY29kZT4gYW5kIDxjb2RlPkNhbGVuZGFyPC9jb2RlPiBwZXJzaXN0ZW50IGZpZWxkcyBzaG91bGQgYmUgaGFuZGxlZCBhcyBtdXRhYmxlIG9iamVjdHMuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGVtcG9yYWwubXV0YWJsZSIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMzIHIxYzMtdDMzIj4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODU3N2I0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U2NoZW1hIEdlbmVyYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0NGQ0IiIG5hbWU9IkNJQUNDRkNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TY2hlbWEgR2VuZXJhdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY5IiBuYW1lPSJzdGhyZWYyNjkiPjwvYT48YSBpZD0ic3RocmVmMjcwIiBuYW1lPSJzdGhyZWYyNzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yJnJzcXVvO3MgU2NoZW1hIEdlbmVyYXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzNSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkRETCBHZW5lcmF0aW9uIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNSByMWMyLXQzNSI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgRERMIGdlbmVyYXRpb246PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+IC0tIERvIG5vdCBnZW5lcmF0ZSBEREw7IG5vIHNjaGVtYSBpcyBnZW5lcmF0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBub24tZXhpc3RlbnQgdGFibGVzOyBsZWF2ZSBleGlzdGluZyB0YWJsZXMgdW5jaGFuZ2VkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RHJvcCBhbmQgQ3JlYXRlIFRhYmxlczwvc3Bhbj4gLS0gQ3JlYXRlIERETCBmb3IgYWxsIHRhYmxlczsgZHJvcCBhbGwgZXhpc3RpbmcgdGFibGVzLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzUgcjFjMy10MzUiPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+T3V0cHV0IE1vZGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNSByMWMyLXQzNSI+Ci08cD5TZWxlY3QgdGhlIERETCBnZW5lcmF0aW9uIHRhcmdldDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Qm90aDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIGFuZCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2U8L3NwYW4+IC0tIEV4ZWN1dGUgU1FMIG9uIHRoZSBkYXRhYmFzZSBvbmx5IChkbyBub3QgZ2VuZXJhdGUgU1FMIGZpbGVzKS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNRTCBTY3JpcHQ8L3NwYW4+IC0tIEdlbmVyYXRlIFNRTCBmaWxlcyBvbmx5IChkbyBub3QgZXhlY3V0ZSB0aGVtIG9uIHRoZSBkYXRhYmFzZSkuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNSByMWMzLXQzNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5EREwgR2VuZXJhdGlvbiBMb2NhdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNwZWNpZnkgd2hlcmUgRWNsaXBzZUxpbmsgd3JpdGVzIERETCBvdXRwdXQuIFNwZWNpZnkgYSBmaWxlIHNwZWNpZmljYXRpb24gdG8gYSBkaXJlY3RvcnkgaW4gd2hpY2ggeW91IGhhdmUgd3JpdGUgYWNjZXNzLiBUaGUgZmlsZSBzcGVjaWZpY2F0aW9uIG1heSBiZSByZWxhdGl2ZSB0byB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb3IgYWJzb2x1dGUuIElmIGl0IGRvZXMgbm90IGVuZCBpbiBhIGZpbGUgc2VwYXJhdG9yLCB0aGVuIEVjbGlwc2VMaW5rIGFwcGVuZHMgb25lIHRoYXQgaXMgdmFsaWQgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzNSByMWMzLXQzNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5DcmVhdGUgRERMIEZpbGUgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgRERMIGZpbGUgdGhhdCBFY2xpcHNlTGluayBnZW5lcmF0ZXMgdGhhdCBjb250YWlucyBTUUwgc3RhdGVtZW50cyBmb3IgY3JlYXRpbmcgdGFibGVzIGZvciBKUEEgZW50aXRpZXMuIFNwZWNpZnkgYSBmaWxlIG5hbWUgdmFsaWQgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzNSByMWMzLXQzNSI+Ci08cD5jcmVhdGVEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+RHJvcCBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBkcm9wcGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzNSByMWMzLXQzNSI+Ci08cD5kcm9wRERMLmpkYmM8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjVmZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnRpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb3BlcnRpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFISkRGRiIgbmFtZT0iQ0lBSEpERkYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb3BlcnRpZXM8L2gxPgotPHA+VGhpcyBwYWdlIGVuYWJsZXMgeW91IHRvIGFkZCBvciByZW1vdmUgdGhlIHZlbmRvci1zcGVjaWZpYyA8Y29kZT4mbHQ7cHJvcGVydGllcyZndDs8L2NvZGU+IGVsZW1lbnRzIG9mIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uPC9wPgotPHA+VG8gYWRkIGEgcHJvcGVydHksIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRoZW4gZW50ZXIgdGhlIHByb3BlcnR5IDxzcGFuIGNsYXNzPSJib2xkIj5OYW1lPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPlZhbHVlPC9zcGFuPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWYzODY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Tb3VyY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNvdXJjZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUhDSkFIIiBuYW1lPSJDSUFIQ0pBSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U291cmNlPC9oMT4KLTxwPlVzaW5nIHRoaXMgcGFnZSwgeW91IGNhbiBtYW51YWxseSBlZGl0IHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTQ4NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByZWZlcmVuY2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RFSUVFIiBuYW1lPSJDQUNERUlFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJlZmVyZW5jZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxN2M4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGlhbG9nczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGlhbG9ncyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFSkRBIiBuYW1lPSJDQUNHRUpEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGlhbG9nczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyBwcmVmZXJlbmNlIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0jQ0lBRkRHSUoiPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0jQ0lBRURFSkYiPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjljNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0dFSEMiIG5hbWU9IkNBQ0NHRUhDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2gxPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cgdG8gY3JlYXRlIG9yIG1vZGlmeSB0aGUgam9pbiB0YWJsZXMgYW5kIGNvbHVtbnMgaW4gcmVsYXRpb25zaGlwIG1hcHBpbmdzLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzcgcjFjMi10MzciPk5hbWUgb2YgdGhlIGpvaW50IHRhYmxlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IHJlbGF0aW9uc2hpcC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGFkMWRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29ucyBhbmQgYnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSWNvbnMgYW5kIGJ1dHRvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESENJQSIgbmFtZT0iQ0FDREhDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkljb25zIGFuZCBidXR0b25zPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBpY29ucyBhbmQgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzAuaHRtI0NBQ0dFQUNHIj5JY29uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMxLmh0bSNDQUNESkNFSSI+QnV0dG9uczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjYzN2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SWNvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjUzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ikljb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDR0VBQ0ciIG5hbWU9IkNBQ0dFQUNHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5JY29uczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGljb25zIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBpY29ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDAiPkljb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQwIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAwNS5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRhYmxlIGVudGl0eSBpY29uIiB0aXRsZT0iRW1iZWRkYWJsZSBlbnRpdHkgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0MCByMWMyLXQ0MCI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkZFSUNFIj5FbWJlZGRhYmxlPC9hPiBlbnRpdHk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nIiBhbHQ9Ik1hcHBlZCBzdXBlcmNsYXNzIGljb24iIHRpdGxlPSJNYXBwZWQgc3VwZXJjbGFzcyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmciIGFsdD0iQmFzaWMgbWFwcGluZyBpY29uIiB0aXRsZT0iQmFzaWMgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ0MCByMWMyLXQ0MCI+QmFzaWMgY29sbGVjdGlvbiBtYXBwaW5nPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0MCByMWMyLXQ0MCI+QmFzaWMgbWFwIG1hcHBpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIHRpdGxlPSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NDAgcjFjMi10NDAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAxMS5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZyIgYWx0PSJJRCBtYXBwaW5nIGljb24iIHRpdGxlPSJJRCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIiBhbHQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQ0MCByMWMyLXQ0MCI+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW9uZSBtYXBwaW5nIGljb24uIiB0aXRsZT0iTWFueS10by1vbmUgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10NDAgcjFjMi10NDAiPjxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDQwIHIxYzItdDQwIj48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE1YzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+PGltZyBzcmM9ImltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10NDAgcjFjMi10NDAiPlRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmciIGFsdD0iVHJhbnNpZW50IG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJUcmFuc2llbnQgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10NDAgcjFjMi10NDAiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDQwIHIxYzItdDQwIj5WYXJpYWJsZSBvbmUtdG8tb25lIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIiBhbHQ9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgdGl0bGU9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10NDAgcjFjMi10NDAiPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1ZmFhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RKQ0VJIiBuYW1lPSJDQUNESkNFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QnV0dG9uczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGJ1dHRvbnMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNyUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDEiPkljb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQxIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZyIgYWx0PSJUaGUgSlBBIFBlcnNwZWN0aXZlIGljb24iIHRpdGxlPSJUaGUgSlBBIFBlcnNwZWN0aXZlIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NDEgcjFjMi10NDEiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5YTczZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JCRElCIiBuYW1lPSJDQUNCQkRJQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjgyIiBuYW1lPSJzdGhyZWYyODIiPjwvYT48YSBpZD0ic3RocmVmMjgzIiBuYW1lPSJzdGhyZWYyODMiPjwvYT48YSBpZD0ic3RocmVmMjg0IiBuYW1lPSJzdGhyZWYyODQiPjwvYT5BZGRpdGlvbmFsIERhbGkgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgb25saW5lIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL2luZGV4LnBocC9EYWxpX0RldmVsb3Blcl9Eb2N1bWVudGF0aW9uIj5odHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbjwvYT48L2NvZGU+PC9wPgotPHA+VGhpcyBkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dDo8L3A+Ci08dWw+Ci08bGk+Ci08cD5EYWxpIGFyY2hpdGVjdHVyZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QbHVnaW5zIHRoYXQgY29tcHJpc2UgdGhlIERhbGkgSlBBIEVjbGlwc2UgZmVhdHVyZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FeHRlbnNpb24gcG9pbnRzPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlODZjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUNBSSIgbmFtZT0iQkFCSElDQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY2IiBuYW1lPSJzdGhyZWY2NiI+PC9hPjxhIGlkPSJzdGhyZWY2NyIgbmFtZT0ic3RocmVmNjciPjwvYT48YSBpZD0ic3RocmVmNjgiIG5hbWU9InN0aHJlZjY4Ij48L2E+WW91IGNhbiBtYWtlIGEgSmF2YSBjbGFzcyBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NWJhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEdCSUVJIiBuYW1lPSJDSUhHQklFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvaDE+Ci08cD5BZGQgYSBzZWNvbmRhcnkgdGFibGUgYW5ub3RhdGlvbiB0byBhbiBlbnRpdHkgaWYgaXRzIGRhdGEgaXMgc3BsaXQgYWNyb3NzIG1vcmUgdGhhbiBvbmUgdGFibGUuPC9wPgotPHA+VG8gYWRkIGEgc2Vjb25kYXJ5IHRhYmxlIHRvIHRoZSBlbnRpdHksPC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjkxIiBuYW1lPSJzdGhyZWY5MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNwZWNpZnlpbmcgU2Vjb25kYXJ5IFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmciIGFsdD0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IlNlY29uZGFyeSBUYWJsZXMgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBhc3NvY2lhdGUgYW4gYWRkaXRpb25hbCB0YWJsZSB3aXRoIHRoZSBlbnRpdHkuIFRoZSBFZGl0IFNlY29uZGFyeSBUYWJsZSBkaWFsb2cgYXBwZWFyczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5OYW1lPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPkNhdGFsb2c8L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYTwvc3Bhbj4gb2YgdGhlIGFkZGl0aW9uYWwgdGFibGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGVudGl0eS48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFNlY29uZGFyeVRhYmxlKG5hbWU9Ik5BTUUiLCBjYXRhbG9nID0gIkNBVEFMT0ciLCBzY2hlbWEgPSAiU0NIRU1BIikKLQotPC9wcmU+Ci08cD5UbyBvdmVycmlkZSB0aGUgZGVmYXVsdCBwcmltYXJ5IGtleTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5FbmFibGUgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5PdmVyd3JpdGUgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIHNwZWNpZnkgYSBuZXcgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4uIFRoZSBDcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVmZXJlbmNlZCBjb2x1bW4gbmFtZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29sdW1uIGRlZmluaXRpb248L3NwYW4+IG9mIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGl0eS48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0aGUgZW50aXR5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBTZWNvbmRhcnlUYWJsZShuYW1lPSJOQU1FIiwgY2F0YWxvZyA9ICJDQVRBTE9HIiwgc2NoZW1hID0gIlNDSEVNQSIsIHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9ImlkIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiaWQiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iTkFNRSIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIlJFRkVSRU5DRUQgQ09MVU1OIE5BTUUiLCBjb2x1bW5EZWZpbml0aW9uID0gIkNPTFVNTiBERUZJTklUSU9OIil9KQotCi08L3ByZT48L2xpPgotPC9vbD4KLTxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQ4YzRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkJKQkciIG5hbWU9IkJBQkZCSkJHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmNDAiIG5hbWU9InN0aHJlZjQwIj48L2E+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9oMT4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjcmVhdGUgYSBKUEEgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyLCBzZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQxIiBuYW1lPSJzdGhyZWY0MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNlbGVjdGluZyB0aGUgQ3JlYXRlIGEgSlBBIEVudGl0eSBXaXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggRW50aXR5IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggRW50aXR5IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBICZndDsgRW50aXR5PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDIiIG5hbWU9InN0aHJlZjQyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQzIiBuYW1lPSJzdGhyZWY0MyI+PC9hPlRoZSBFbnRpdHkgQ2xhc3MgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZyIgYWx0PSJUaGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgd2l6YXJkLiIgdGl0bGU9IlRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIEVudGl0eSB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkNvbXBsZXRlIHRoaXMgcGFnZSBhcyBmb2xsb3dzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9qZWN0PC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Tb3VyY2UgRm9sZGVyPC9zcGFuPiBmaWVsZCwgc2VsZWN0LCBvciBlbnRlciwgdGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIDxjb2RlPnNyYzwvY29kZT4gZm9sZGVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QsIG9yIGVudGVyLCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZSBmb3IgdGhpcyBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KYXZhIFBhY2thZ2U8L3NwYW4+IGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNsYXNzIG5hbWU8L3NwYW4+IGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIGVudGVyLCBvciBzZWxlY3QgYSBzdXBlcmNsYXNzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIGNvbXBsZXRlIHRoZSBJbmhlcml0YW5jZSBzZWN0aW9uIGFzIGZvbGxvd3MgKHRoZXNlIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsKTo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BY2NlcHQgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IG9wdGlvbiAodGhlIGRlZmF1bHQpIHRvIGNyZWF0ZSBhIEphdmEgY2xhc3Mgd2l0aCB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gb3B0aW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BbHRlcm5hdGl2ZWx5LCBzZWxlY3QgPGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT4gKGlmIHlvdSBkZWZpbmVkIGEgc3VwZXIgY2xhc3MpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkluaGVyaXRhbmNlPC9zcGFuPiBhbmQgdGhlbiBzZWxlY3Qgb25lIG9mIHRoZSBKU1IgMjIwIGluaGVyaXRhbmNlIG1hcHBpbmcgc3RyYXRlZ2llcyAoU0lOR0xFX1RBQkxFLCBUQUJMRV9QRVJfQ0xBU1MsIEpPSU5FRCkuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHRvIGVudGl0eSBtYXBwaW5ncyBpbiBYTUw8L3NwYW4+IHRvIGNyZWF0ZSBYTUwgbWFwcGluZ3MgaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4sIHJhdGhlciB0aGFuIGFubm90YXRpb25zLjwvcD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+IHRvIHByb2NlZWQgdG8gdGhlIDxhIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+IHdoZXJlIHlvdSBkZWZpbmUgdGhlIHBlcnNpc3RlbnQgZmllbGRzIGZvciB0aGUgZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQ0IiBuYW1lPSJzdGhyZWY0NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWY0NSIgbmFtZT0ic3RocmVmNDUiPjwvYT5UaGUgRW50aXR5IFByb3BlcnRpZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nIiBhbHQ9IlRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiB0aXRsZT0iVGhlIEVudGl0eSBQcm9wZXJ0aWVzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgRW50aXR5IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+QWx0ZXJuYXRpdmVseSwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4gdG8gY29tcGxldGUgdGhlIGVudGl0eS48L3A+Ci08L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHBhZ2UgYXMgZm9sbG93czo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIGVudGVyIGEgbmV3IG5hbWUgZm9yIHRoZSBlbnRpdHkuIERvaW5nIHNvIHJlc3VsdHMgaW4gYWRkaW5nIGEgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIHRvIHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBub3RhdGlvbiAoPGNvZGU+QEVudGl0eShuYW1lPSJFbnRpdHlOYW1lIik8L2NvZGU+KS48L3A+Ci08L2xpPgotPGxpPgotPHA+QWNjZXB0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gKHRoZSBkZWZhdWx0IHNldHRpbmcpIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG5hbWUgb2YgdGhlIG1hcHBlZCB0YWJsZS4gRW50ZXJpbmcgYSBkaWZmZXJlbnQgbmFtZSByZXN1bHRzIGluIGFkZGluZyB0aGUgPGNvZGU+QFRhYmxlPC9jb2RlPiBub3RhdGlvbiB3aXRoIGl0cyA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgZGVmaW5lZCBhcyB0aGUgbmV3IHRhYmxlICg8Y29kZT5AVGFibGUobmFtZT0iVGFibGVOYW1lIik8L2NvZGU+KS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBFbnRpdHkgTmFtZS1yZWxhdGVkIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgaWYgeW91IHNlbGVjdGVkIDxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+IG9uIHRoZSA8YSBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+QWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGUgZW50aXR5IGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LiBUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0NiIgbmFtZT0ic3RocmVmNDYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgRW50aXR5IEZpZWxkcyBEaWFsb2c8L3A+Ci08aW1nIHNyYz0iaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmciIGFsdD0iVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiIgdGl0bGU9IlRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgYSBwZXJzaXN0ZW5jZSB0eXBlIGZyb20gdGhlIFR5cGUgbGlzdC4gWW91IGNhbiByZXRyaWV2ZSBhZGRpdGlvbmFsIHR5cGVzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGZpZWxkIG5hbWUgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi4gUmVwZWF0IHRoaXMgcHJvY2VkdXJlIGZvciBlYWNoIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiB0byBkZXNpZ25hdGUgdGhlIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCBlaXRoZXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZC1iYXNlZDwvc3Bhbj4gYWNjZXNzIHR5cGUgKHRoZSBkZWZhdWx0KSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHktYmFzZWQ8L3NwYW4+IGFjY2VzcyB0eXBlLjwvcD4KLTwvbGk+Ci08L29sPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBFY2xpcHNlIGFkZHMgdGhlIGVudGl0eSB0byB5b3VyIHByb2plY3QuPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDVhYTVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhIRUpDSiIgbmFtZT0iQ0lISEVKQ0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNiIgbmFtZT0ic3RocmVmMjYiPjwvYT48YSBpZD0ic3RocmVmMjciIG5hbWU9InN0aHJlZjI3Ij48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyOCIgbmFtZT0ic3RocmVmMjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMjkiIG5hbWU9InN0aHJlZjI5Ij48L2E+U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmciIGFsdD0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBKUEEgcHJvamVjdCBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEpQQSBwcm9qZWN0IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFByb2plY3Q8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMCIgbmFtZT0ic3RocmVmMzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMzEiIG5hbWU9InN0aHJlZjMxIj48L2E+VGhlIEpQQSBQcm9qZWN0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgdGl0bGU9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiB0byBzcGVjaWZ5IHRoZSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIEphdmEgc291cmNlIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMiIgbmFtZT0ic3RocmVmMzIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgSmF2YSBTb3VyY2UgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBGb2xkZXI8L3NwYW4+IHRvIGFkZCBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyB0byB0aGUgcHJvamVjdC48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzMiIG5hbWU9InN0aHJlZjMzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM0IiBuYW1lPSJzdGhyZWYzNCI+PC9hPlRoZSBKUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1JZiB0aGUgc2VydmVyIHJ1bnRpbWUgZG9lcyBub3QgcHJvdmlkZSBhIEpQQSBpbXBsZW1lbnRhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBzZWxlY3QgYSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4KLTxwPlRvIGluc3VyZSB0aGUgcG9ydGFiaWxpdHkgb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgRUpCIDMuMCwgdGhlIHBlcnNpc3RlbnQgY2xhc3NlcyB3aWxsIGJlIGRpc2NvdmVyZWQgYXV0b21hdGljYWxseS48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIGNyZWF0aW5nIEpQQSBwcm9qZWN0cy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gWW91IHNob3VsZCBub3cgb3BlbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTNmYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIQ0NDSkQiIG5hbWU9IkNJSENDQ0pEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmOTIiIG5hbWU9InN0aHJlZjkyIj48L2E+PGEgaWQ9InN0aHJlZjkzIiBuYW1lPSJzdGhyZWY5MyI+PC9hPkFuIGVudGl0eSBtYXkgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZW50aXRpZXMuIFlvdSBjYW4gc3BlY2lmeSBhIHNwZWNpZmljIHN0cmF0ZWd5IHRvIHVzZSBmb3IgaW5oZXJpdGFuY2UuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHNwZWNpZnkgaW5oZXJpdGFuY2UgKDxjb2RlPkBJbmhlcml0YW5jZSk8L2NvZGU+IGZvciBhbiBleGlzdGluZyBlbnRpdHkgKDxjb2RlPkBFbnRpdHk8L2NvZGU+KTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SW5oZXJpdGFuY2U8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjk0IiBuYW1lPSJzdGhyZWY5NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNwZWNpZnlpbmcgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3RhYi5wbmciIGFsdD0iU2VsZWN0aW5nIHRoZSBJbmhlcml0YW5jZSBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IlNlbGVjdGluZyB0aGUgSW5oZXJpdGFuY2UgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiBsaXN0LCBzZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWdpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+QSBzaW5nbGUgdGFibGUgKGRlZmF1bHQpPC9wPgotPC9saT4KLTxsaT4KLTxwPkpvaW5lZCB0YWJsZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbmUgdGFibGUgcGVyIGNsYXNzPC9wPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSBmb2xsb3dpbmcgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIHRhYi4gU2VlIDxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDRkhHSEUiPiJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI8L2E+IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDEzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJzdGhyZWY5NSIgbmFtZT0ic3RocmVmOTUiPjwvYT48YSBpZD0ic3RocmVmOTYiIG5hbWU9InN0aHJlZjk2Ij48L2E+RGlzY3JpbWluYXRvciBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMyLXQxMyI+TmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5TaW5nbGU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luZWQ8L3NwYW4+IGluaGVyaXRhbmNlIHN0cmF0ZWd5LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QERpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPkRpc2NyaW1pbmF0b3IgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzItdDEzIj5TZXQgdGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB0byA8Y29kZT5DaGFyPC9jb2RlPiBvciA8Y29kZT5JbnRlZ2VyPC9jb2RlPiAoaW5zdGVhZCBvZiBpdHMgZGVmYXVsdDogPGNvZGU+U3RyaW5nPC9jb2RlPikuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBWYWx1ZTwvc3Bhbj4gbXVzdCBjb25mb3JtIHRvIHRoaXMgdHlwZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMzLXQxMyI+U3RyaW5nPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9InN0aHJlZjk3IiBuYW1lPSJzdGhyZWY5NyI+PC9hPjxhIGlkPSJzdGhyZWY5OCIgbmFtZT0ic3RocmVmOTgiPjwvYT5EaXNjcmltaW5hdG9yIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMi10MTMiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QERpc2NyaW1pbmF0b3JWYWx1ZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+T3ZlcnJpZGUgRGVmYXVsdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5Vc2UgdGhpcyBmaWVsZCB0byBzcGVjaWZ5IGN1c3RvbSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AUHJpbWFyeUtleUpvaW5DbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHkgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5IRVJJVEFOQ0VfU1RSQVRFR1kmZ3Q7PC9zcGFuPikKLUBEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtESVNDUklNSU5BVE9SX0NPTFVNTiZndDs8L3NwYW4+IiwKLSAgICBkaXNjcmltaW5hdG9yVHlwZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9UWVBFJmd0Ozwvc3Bhbj4pCi1ARGlzY3JpbWluYXRvclZhbHVlKHZhbHVlLSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9WQUxVRSZndDs8L3NwYW4+IikKLUBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgCi0gICAgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1JFRkVSRU5DRURfQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIpCi0KLTwvcHJlPgotPHA+PGEgaWQ9InN0aHJlZjk5IiBuYW1lPSJzdGhyZWY5OSI+PC9hPjxhIGlkPSJzdGhyZWYxMDAiIG5hbWU9InN0aHJlZjEwMCI+PC9hPjxhIGlkPSJzdGhyZWYxMDEiIG5hbWU9InN0aHJlZjEwMSI+PC9hPlRoZSBmb2xsb3dpbmcgZmlndXJlcyBpbGx1c3RyYXRlcyB0aGUgZGlmZmVyZW50IGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTAyIiBuYW1lPSJzdGhyZWYxMDIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TaW5nbGUgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgZW50aXR5IGluaGVyaXRhbmNlIGluIGEgc2luZ2xlIHRhYmxlLiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTAzIiBuYW1lPSJzdGhyZWYxMDMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTA0IiBuYW1lPSJzdGhyZWYxMDQiPjwvYT48YSBpZD0ic3RocmVmMTA1IiBuYW1lPSJzdGhyZWYxMDUiPjwvYT5Kb2luZWQgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWM4ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhER0RDRCIgbmFtZT0iQ0lIREdEQ0QiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY1NyIgbmFtZT0ic3RocmVmNTciPjwvYT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9oMT4KLTxwPldoZW4gY3JlYXRpbmcgYSBKUEEgcHJvamVjdCwgKHNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+KSB5b3UgY2FuIGFsc28gY3JlYXRlIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgbWFwcGluZyBtZXRhZGF0YSBhbmQgZGVmYXVsdHMuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjU4IiBuYW1lPSJzdGhyZWY1OCI+PC9hPkVjbGlwc2UgY3JlYXRlcyB0aGUgPGNvZGU+TUVUQS1JTkZcb3JtLnhtbDwvY29kZT4gZmlsZSBpbiB5b3VyIHByb2plY3QncyBkaXJlY3Rvcnk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtwZXJzaXN0ZW5jZSB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfVkVSU0lPTiZndDs8L3NwYW4+IgotICAgICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QiJmd0OwotICAmbHQ7cGVyc2lzdGVuY2UtdW5pdCBuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfVU5JVF9OQU1FJmd0Ozwvc3Bhbj4iJmd0OwotICAgICZsdDtwcm92aWRlcj0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1BFUlNJU1RFTkNFX1BST1ZJREVSJmd0Ozwvc3Bhbj4iIC8mZ3Q7Ci0gICZsdDsvcGVyc2lzdGVuY2UtdW5pdCZndDsKLSZsdDsvcGVyc2lzdGVuY2UmZ3Q7Ci08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0jQ0lBRURFSkYiPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDQuaHRtI0NJSEJDRENFIj5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDMuaHRtI0NIREJJSkFDIj5UaGUgb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDI3ZGFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERBSklEIiBuYW1lPSJDSUhEQUpJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjQ3IiBuYW1lPSJzdGhyZWY0NyI+PC9hPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNDgiIG5hbWU9InN0aHJlZjQ4Ij48L2E+V2hlbiB5b3UgY3JlYXRlIGEgcHJvamVjdCwgRWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxwZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIHByb2plY3QncyBkaXJlY3RvcnkuPC9wPgotPHA+WW91IGNhbiBjcmVhdGUgYSBzdHViIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5IHdoZW4geW91IGNyZWF0ZSBhIEpQQSBwcm9qZWN0IChzZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPikuIFlvdSBjYW4gbWFuYWdlIHRoaXMgZmlsZSBlaXRoZXIgdGhyb3VnaCB0aGUgWE1MIGVkaXRvciAoc2VlICkgb3IgdGhyb3VnaCB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBFY2xpcHNlTGluayksIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYWdlcyBtYXkgYmUgYXZhaWxhYmxlIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yOgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE5Lmh0bSNDSUFKQUZFRyI+Q3VzdG9taXphdGlvbjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBjaGFuZ2UtdHJhY2tpbmcgYW5kIHNlc3Npb24gY3VzdG9taXplci1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2FjaGluZyBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjEuaHRtI0NJQUJHSEhJIj5Mb2dnaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGxvZ2dpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIyLmh0bSNDSUFGSkNIRSI+T3B0aW9uczwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBzZXNzaW9uIGFuZCB0YXJnZXQgZGF0YWJhc2UgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFDQ0ZDQiI+U2NoZW1hIEdlbmVyYXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgRERMLXJlbGF0ZWQgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgRWNsaXBzZUxpbmsgSlBBIGltcGxlbWVudGF0aW9uLCB0aGUgQ29ubmVjdGlvbnMgcGFnZSBhbHNvIGluY2x1ZGVzIEpEQkMgY29ubmVjdGlvbiBwb29sIHByb3BlcnRpZXMuPC9wPgotPHA+SWYgdGhlIHByb2plY3QgdXNlcyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgdGhlbiBvbmx5IHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+LCA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUZGSklFIj5Db25uZWN0aW9uPC9hPiwgPGEgaHJlZj0icmVmZXJlbmNlMDI0Lmh0bSNDSUFISkRGRiI+UHJvcGVydGllczwvYT4gYW5kIDxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT4gcGFnZXMgYXJlIGF2YWlsYWJsZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIHVzZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBFZGl0b3I6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgPGNvZGU+cGVyaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+IHBhZ2Ugb2YgdGhlIGVkaXRvciBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmFsPC9zcGFuPiBwYWdlIHRvIGRlZmluZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlcyA8Y29kZT4mbHQ7cGVyc2lzdGVudC11bml0Jmd0OzwvY29kZT4tcmVsYXRlZCBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIDxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+LCBhbmQgPGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT4gZWxlbWVudHMgKGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlKS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvcidzIFNvdXJjZSBwYWdlIGVuYWJsZXMgeW91IHRvIHZpZXcgYW5kIGVkaXQgdGhlIHJhdyBYTUwgZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyOSUiIC8+Ci08Y29sIHdpZHRoPSIyOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ4Ij5FbGVtZW50IERlZmluZWQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3BlcnNpc3RlbmNlLXVuaXQgbmFtZSA9ICImbHQ7TmFtZSZndDsiJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+PGEgaWQ9InN0aHJlZjQ5IiBuYW1lPSJzdGhyZWY0OSI+PC9hPlBlcnNpc3RlbmNlIFByb3ZpZGVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5EZXNjcmlwdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+RW50ZXIgYSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LiBUaGlzIGlzIGFuIG9wdGlvbmFsIHByb3BlcnR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+PGEgaWQ9InN0aHJlZjUwIiBuYW1lPSJzdGhyZWY1MCI+PC9hPk1hbmFnZWQgQ2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMi10OCI+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij4mbmJzcDsmbmJzcDtFeGNsdWRlJm5ic3A7VW5saXN0ZWQmbmJzcDtDbGFzc2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMyLXQ4Ij5TZWxlY3QgdG8gaW5jbHVkZSBhbGwgYW5ub3RhdGVkIGVudGl0eSBjbGFzc2VzIGluIHRoZSByb290IG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2V4Y2x1ZGUtdW5saXN0ZWQtY2xhc3NlcyZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlhNTCZuYnNwO01hcHBpbmcmbmJzcDtGaWxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDggcjFjMi10OCI+QWRkIG9yIHJlbW92ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBYTUwgZmlsZXMgZGVmaW5lIHRoZSBjbGFzc2VzIG1hbmFnZWQgdGhyb3VnaCB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDttYXBwaW5nLWZpbGUmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij48YSBpZD0ic3RocmVmNTEiIG5hbWU9InN0aHJlZjUxIj48L2E+Jm5ic3A7Jm5ic3A7RXhjbHVkZSZuYnNwO1VubGlzdGVkJm5ic3A7RWNsaXBzZUxpbmsmbmJzcDtYTUwmbmJzcDtNYXBwaW5nJm5ic3A7RmlsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDggcjFjMi10OCI+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBFY2xpcHNlTGluayBtYXBwaW5nIGZpbGVzLgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vdGU8L3NwYW4+OiBUaGlzIGZpZWxkIGFwcGxpZXMgb25seSB3aGVuIHVzaW5nIEVjbGlwc2VMaW5rIEpQQSBpbXBsZW1lbnRhdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmV4Y2x1ZGUtZWNsaXBzZWxpbmstb3JtIiB2YWx1ZT0idHJ1ZSIvJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT4gcGFnZSB0byBkZWZpbmUgdGhlIDxjb2RlPiZsdDtqdGEtZGF0YS1zb3VyY2UmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O25vbi1qdGEtZGF0YS1zb3VyY2UmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcyBmb2xsb3dzOjwvcD4KLTxwPlRvIGNvbmZpZ3VyZSB0aGUgSlRBIChKYXZhIFRyYW5zYWN0aW9uIEFQSSkgc291cmNlIHVzZWQgYnkgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiBmcm9tIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGxpc3QuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBnbG9iYWwgSk5ESSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIGNvbmZpZ3VyZSBhIG5vbi1KVEEgZGF0YSBzb3VyY2U6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5SZXNvdXJjZSBMb2NhbDwvc3Bhbj4gZnJvbSB0aGUgVHJhbnNhY3Rpb24gVHlwZSBsaXN0LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQoKTwvc3Bhbj4gdG8gdXNlIHRoZSBkYXRhIHNvdXJjZSBwcm92aWRlZCBieSB0aGUgY29udGFpbmVyLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTwvb2w+Ci08cD48YSBpZD0ic3RocmVmNTIiIG5hbWU9InN0aHJlZjUyIj48L2E+Rm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLCB5b3UgY2FuIGFsc28gZGVmaW5lIHRoZSBFY2xpcHNlTGluayBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBVUkwsIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgdGFibGUgaW4gdGhlIFByb3BlcnRpZXMgcGFnZSB0byBzZXQgdGhlIHZlbmRvci1zcGVjaWZpYyA8Y29kZT4mbHQ7cHJvcGVydGllcyZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgotPHA+VG8gYWRkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgPGNvZGU+Jmx0O25hbWUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3ZhbHVlJmd0OzwvY29kZT4gYXR0cmlidXRlcyBmb3IgdGhlIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQgdXNpbmcgdGhlIHRhYmxlJ3MgTmFtZSBhbmQgVmFsdWUgZmllbGRzLjwvcD4KLTwvbGk+Ci08L29sPgotPHA+VG8gcmVtb3ZlIGEgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudCwgc2VsZWN0IGEgZGVmaW5lZCBwcm9wZXJ0eSBpbiB0aGUgdGFibGUgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlbW92ZTwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1JZiB0aGUgcHJvamVjdCB1c2VzIHRoZSBFY2xpcHNlTGluayBwbGF0Zm9ybSwgdGhlIGNvbm5lY3Rpb24gcGFnZSBhbHNvIGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIEpEQkMgY29ubmVjdGlvbiBwb29saW5nLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDAyLmh0bSNDSUhGRUJBSSI+U3luY2hyb25pemluZyBjbGFzc2VzPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhZTZhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGluZyBhbiBlbnRpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgYW4gZW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREdCSUoiIG5hbWU9IkJBQkRHQklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPk1hcHBpbmcgYW4gZW50aXR5PC9oMT4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtYXBwaW5nIHR5cGVzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDExLmh0bSNDSUhESUFFRSI+RW1iZWRkZWQgSUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTIuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QWRkaXRpb25hbCBtYXBwaW5nIHR5cGVzIChzdWNoIGFzIEJhc2ljIENvbGxlY3Rpb24gbWFwcGluZ3MpIG1heSBiZSBhdmFpbGFibGUgd2hlbiB1c2luZyBEYWxpIHdpdGggRWNsaXBzZUxpbmsuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJlZTY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhc2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyNSIgbmFtZT0ic3RocmVmMjUiPjwvYT48L3A+Ci08aDE+VGFza3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBwcm9jZWR1cmVzIGZvciBhY2Nlc3NpbmcgdGhlIERhbGkgT1IgbWFwcGluZyB0b29sIGZ1bmN0aW9uYWxpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIxLmh0bSNCQUJGQUlCQSI+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNC5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhNGZjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJFSUJBREhIIiBuYW1lPSJCRUlCQURISCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYzNSIgbmFtZT0ic3RocmVmMzUiPjwvYT48YSBpZD0ic3RocmVmMzYiIG5hbWU9InN0aHJlZjM2Ij48L2E+PGEgaWQ9InN0aHJlZjM3IiBuYW1lPSJzdGhyZWYzNyI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjb252ZXJ0IGFuIGV4aXN0aW5nIEphdmEgcHJvamVjdCB0byBhIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IGV4cGxvcmVyLCByaWdodC1jbGljayB0aGUgSmF2YSBwcm9qZWN0IGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlICZndDsgQ29udmVydCB0byBKUEEgUHJvamVjdC48L3NwYW4+IFRoZSBQcm9qZWN0IEZhY2V0cyBwYWdlIG9mIHRoZSBNb2RpZnkgRmFjZXRlZCBQcm9qZWN0IHdpemFyZCBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM4IiBuYW1lPSJzdGhyZWYzOCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1vZGlmeSBGYWNldGVkIFByb2plY3QgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJhdGlvbjwvc3Bhbj4gdG8gPHNwYW4gY2xhc3M9ImJvbGQiPlV0aWxpdHkgSlBBIHByb2plY3Q8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOSIgbmFtZT0ic3RocmVmMzkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIGFkZHMgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMgdG8geW91ciBwcm9qZWN0IGFuZCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgPGNvZGU+b3JtLnhtbDwvY29kZT4gYW5kIDxjb2RlPnBlcmlzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODYyMTkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN5bmNocm9uaXppbmcgY2xhc3NlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3luY2hyb25pemluZyBjbGFzc2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRkVCQUkiIG5hbWU9IkNJSEZFQkFJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TeW5jaHJvbml6aW5nIGNsYXNzZXM8L2gxPgotPHA+QXMgeW91IHdvcmsgd2l0aCB0aGUgY2xhc3NlcyBpbiB5b3VyIEphdmEgcHJvamVjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSB0byByZWZsZWN0IHRoZSBjaGFuZ2VzLiA8YSBpZD0ic3RocmVmNTMiIG5hbWU9InN0aHJlZjUzIj48L2E+PGEgaWQ9InN0aHJlZjU0IiBuYW1lPSJzdGhyZWY1NCI+PC9hPjxhIGlkPSJzdGhyZWY1NSIgbmFtZT0ic3RocmVmNTUiPjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gc3luY2hyb25pemUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlN5bmNocm9uaXplIENsYXNzZXM8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJib2xkIj5Bbm5vdGF0ZWQgY2xhc3NlcyBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIG9wdGlvbjwvc3Bhbj4gaW4gdGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4uIEluIGdlbmVyYWwsIHlvdSBkbyBub3QgaGF2ZSB0byB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjU2IiBuYW1lPSJzdGhyZWY1NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlN5bmNocm9uaXppbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBGaWxlPC9wPgotPGltZyBzcmM9ImltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5EYWxpIGFkZHMgdGhlIG5lY2Vzc2FyeSA8Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QZXJzaXN0ZW5jZSBYTUwgRWRpdG9yPC9zcGFuPiB0byBjb250aW51ZSBlZGl0aW5nIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDlkMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhbiBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjU5IiBuYW1lPSJzdGhyZWY1OSI+PC9hPgotPGgxPkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNjAiIG5hbWU9InN0aHJlZjYwIj48L2E+SWYgeW91IG9wdCBub3QgdG8gY3JlYXRlIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgd2hlbiB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QsIHlvdSBjYW4gY3JlYXRlIG9uZSB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjEiIG5hbWU9InN0aHJlZjYxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFNlbGVjdCBhIFdpemFyZCBEaWFsb2c8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIE1hcHBpbmcgZmlsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIE1hcHBpbmcgZmlsZSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBpbmcgRmlsZTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgTWFwcGluZyBGaWxlIHBhZ2UgYXBwZWFycy48L3A+Ci08cD5JZiB5b3UgYXJlIHVzaW5nIEVjbGlwc2VMaW5rLCB5b3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RWNsaXBzZUxpbmsgJmd0OyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGU8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjYyIiBuYW1lPSJzdGhyZWY2MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIEZpbGUgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ19maWxlX25ldy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlLiIgdGl0bGU9IlRoZSBNYXBwaW5nIEZpbGUgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5EZWZpbmUgdGhlIHByb3BlcnRpZXMgaW4gdGhlIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBUaGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBhcHBlYXJzIGluIHRoZSBzcmMgZGlyZWN0b3J5IG9mIHRoZSBzZWxlY3RlZCBKUEEgcHJvamVjdC4gWW91IGNhbiBtYW5hZ2UgdGhlIG9ybS54bWwgZmlsZSB1c2luZyB0aGUgSlBBIERldGFpbHMgdmlldyBvciB0aHJvdWdoIHRoZSBYTUwgRWRpdG9yLiBTZWUgYWxzbyA8YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOGNiM2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEJDRENFIiBuYW1lPSJDSUhCQ0RDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V29ya2luZyB3aXRoIG9ybS54bWwgZmlsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNjMiIG5hbWU9InN0aHJlZjYzIj48L2E+PGEgaWQ9InN0aHJlZjY0IiBuYW1lPSJzdGhyZWY2NCI+PC9hPllvdSBjYW4gd29yayB3aXRoIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBieSB1c2luZyB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gd29yayB3aXRoIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPk9wZW48L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eU1hcHBpbmdzPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSBKUEEgRGV0YWlscyB2aWV3IHRvIGNvbmZpZ3VyZSB0aGUgZW50aXR5IG1hcHBpbmcgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjUiIG5hbWU9InN0aHJlZjY1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgdmlldyBmb3IgRW50aXR5TWFwcGluZ3MgKG9ybS54bWwpPC9wPgotPGltZyBzcmM9ImltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZyIgYWx0PSJKUEEgRGV0YWlscyB2aWV3IGZvciBvcm0ueG1sIGZpbGUuIiB0aXRsZT0iSlBBIERldGFpbHMgdmlldyBmb3Igb3JtLnhtbCBmaWxlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PGJyIC8+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSIjQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sIj5Xb3JraW5nIHdpdGggWE1MIEZpbGVzPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDMuaHRtI0NIREJJSkFDIj5UaGUgb3JtLnhtbCBmaWxlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTZhMjg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVudGl0eTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0JJRUUiIG5hbWU9IkJBQkdCSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY5IiBuYW1lPSJzdGhyZWY2OSI+PC9hPjxhIGlkPSJzdGhyZWY3MCIgbmFtZT0ic3RocmVmNzAiPjwvYT48YSBpZD0ic3RocmVmNzEiIG5hbWU9InN0aHJlZjcxIj48L2E+PGEgaWQ9InN0aHJlZjcyIiBuYW1lPSJzdGhyZWY3MiI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGlzIGEgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0LjwvcD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXMuIEVudGl0aWVzIG1heSBhbHNvIGV4dGVuZCBub24tZW50aXR5IGNsYXNzZXMgYXMgd2VsbCBhcyBlbnRpdHkgY2xhc3NlcywgYW5kIG5vbi1lbnRpdHkgY2xhc3NlcyBtYXkgZXh0ZW5kIGVudGl0eSBjbGFzc2VzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QW4gZW50aXR5IDxzcGFuIGNsYXNzPSJpdGFsaWMiPm11c3QgaGF2ZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QSBuby1hcmcgY29uc3RydWN0b3IgKHB1YmxpYyBvciBwcm90ZWN0ZWQpOyB0aGUgZW50aXR5IGNsYXNzIG1heSBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyBhcyB3ZWxsLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PGEgaWQ9InN0aHJlZjczIiBuYW1lPSJzdGhyZWY3MyI+PC9hPjxhIGlkPSJzdGhyZWY3NCIgbmFtZT0ic3RocmVmNzQiPjwvYT48YSBpZD0ic3RocmVmNzUiIG5hbWU9InN0aHJlZjc1Ij48L2E+RWFjaCBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGJlIG1hcHBlZCB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb250YWluIGEgcHJpbWFyeSBrZXkuIFBlcnNpc3RlbnQgZW50aXRpZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXIuPC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBhY2Nlc3MgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBJbiB0aGUgZm9sbG93aW5nIGZpZ3VyZSwgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+ZW50aXR5PC9zcGFuPiBpbnZva2VzIHRoZSBkaWFsb2cgZnJvbSB0aGUgSlBBIERldGFpbHMgVmlldy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY3NiIgbmFtZT0ic3RocmVmNzYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgTWFwcGluZyBUeXBlIEh5cGVybGluazwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciBhbiBlbnRpdHkgc2hvd2luZyB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluay4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBjaGFuZ2UgKG9yIGFkZCkgcGVyc2lzdGVuY2UgZm9yIGFuIGVudGl0eSBieSByaWdodC1jbGlja2luZyB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldyBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW50aXR5PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGZyb20gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzciIG5hbWU9InN0aHJlZjc3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJmOTEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVtYmVkZGFibGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVtYmVkZGFibGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGRUlDRSIgbmFtZT0iQkFCRkVJQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVtYmVkZGFibGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjc4IiBuYW1lPSJzdGhyZWY3OCI+PC9hPjxhIGlkPSJzdGhyZWY3OSIgbmFtZT0ic3RocmVmNzkiPjwvYT5BbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQ8L3NwYW4+IGNsYXNzIGlzIGEgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSBzdG9yZWQgYXMgcGFydCBvZiBhbiBvd25pbmcgZW50aXR5OyBpdCBzaGFyZXMgdGhlIGlkZW50aXR5IG9mIHRoZSBvd25pbmcgZW50aXR5LiBFYWNoIGZpZWxkIG9mIHRoZSBlbWJlZGRlZCBjbGFzcyBpcyBtYXBwZWQgdG8gdGhlIGRhdGFiYXNlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3duaW5nIGVudGl0eS48L3A+Ci08cD5UbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjgwIiBuYW1lPSJzdGhyZWY4MCI+PC9hPjxhIGlkPSJzdGhyZWY4MSIgbmFtZT0ic3RocmVmODEiPjwvYT48YSBpZD0ic3RocmVmODIiIG5hbWU9InN0aHJlZjgyIj48L2E+QW4gZW1iZWRkYWJsZSBlbnRpdHkgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QEVtYmVkZGFibGU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBlbWJlZGRhYmxlIHBlcnNpc3RlbmNlIHRvIGFuIGV4aXN0aW5nIGVudGl0eTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5PcGVuIHRoZSBKYXZhIGNsYXNzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gb3BlbiB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkYWJsZTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY4MyIgbmFtZT0ic3RocmVmODMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoRW1iZWRkYWJsZSk8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVtYmVkZGFibGUgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgcmVtYWluaW5nIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxkbD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48L2RkPgotPGRkPjxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48L2RkPgotPC9kbD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ2ZDJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBlZCBzdXBlcmNsYXNzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwZWQgc3VwZXJjbGFzcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRBR0NJIiBuYW1lPSJCQUJEQUdDSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFwcGVkIHN1cGVyY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjg0IiBuYW1lPSJzdGhyZWY4NCI+PC9hPjxhIGlkPSJzdGhyZWY4NSIgbmFtZT0ic3RocmVmODUiPjwvYT5BbiBlbnRpdHkgdGhhdCBleHRlbmRzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBjbGFzcyBpbmhlcml0cyB0aGUgcGVyc2lzdGVudCBzdGF0ZSBhbmQgbWFwcGluZyBpbmZvcm1hdGlvbiBmcm9tIGEgc3VwZXJjbGFzcy4gWW91IHNob3VsZCB1c2UgYSBtYXBwZWQgc3VwZXJjbGFzcyB0byBkZWZpbmUgbWFwcGluZyBpbmZvcm1hdGlvbiB0aGF0IGlzIGNvbW1vbiB0byBtdWx0aXBsZSBlbnRpdHkgY2xhc3Nlcy48L3A+Ci08cD5BIG1hcHBlZCBzdXBlcmNsYXNzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNhbiBiZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QWJzdHJhY3Qgb3IgY29uY3JldGUgY2xhc3NlczwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW5ub3QgYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkJlIHF1ZXJpZWQgb3IgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIEVudGl0eS1NYW5hZ2VyIG9yIFF1ZXJ5IG9wZXJhdGlvbnM8L3A+Ci08L2xpPgotPGxpPgotPHA+QmUgdGhlIHRhcmdldCBvZiBhIHBlcnNpc3RlbnQgcmVsYXRpb25zaGlwPC9wPgotPC9saT4KLTwvdWw+Ci08cD5BIG1hcHBlZCBzdXBlcmNsYXNzIGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIGRhdGFiYXNlIHRhYmxlLiBJbnN0ZWFkLCBpdHMgbWFwcGluZyBpbmZvcm1hdGlvbiBpcyBkZXJpdmVkIGZyb20gaXRzIHN1cGVyY2xhc3MuIFRvIG92ZXJyaWRlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHN1YmNsYXNzLCB1c2UgdGhlIDxjb2RlPkBBdHRyaWJ1dGVPdmVycmlkZTwvY29kZT4gYW5ub3RhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBjbGFzcy48L3A+Ci08cD48YSBpZD0ic3RocmVmODYiIG5hbWU9InN0aHJlZjg2Ij48L2E+PGEgaWQ9InN0aHJlZjg3IiBuYW1lPSJzdGhyZWY4NyI+PC9hPjxhIGlkPSJzdGhyZWY4OCIgbmFtZT0ic3RocmVmODgiPjwvYT48YSBpZD0ic3RocmVmODkiIG5hbWU9InN0aHJlZjg5Ij48L2E+QSBtYXBwZWQgc3VwZXJjbGFzcyBpcyBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ATWFwcGVkU3VwZXJjbGFzczwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIE1hcHBlZCBTdXBlcmNsYXNzIHBlcnNpc3RlbmNlIHRvIGFuIGV4aXN0aW5nIGVudGl0eTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5PcGVuIHRoZSBKYXZhIGNsYXNzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIGNsaWNrIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rIHRvIG9wZW4gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjkwIiBuYW1lPSJzdGhyZWY5MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nIChNYXBwZWQgU3VwZXJjbGFzcyk8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggTWFwcGVkIFN1cGVyY2xhc3Mgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggTWFwcGVkIFN1cGVyY2xhc3Mgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE5ZDQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJR0JHRyIgbmFtZT0iQkFCSUdCR0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwNiIgbmFtZT0ic3RocmVmMTA2Ij48L2E+PGEgaWQ9InN0aHJlZjEwNyIgbmFtZT0ic3RocmVmMTA3Ij48L2E+TmFtZWQgcXVlcmllcyBpbXByb3ZlIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNlIGJlY2F1c2UgdGhleSBhcmUgcHJlcGFyZWQgb25jZSBhbmQgdGhleSAoYW5kIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIHN1cHBvcnRpbmcgb2JqZWN0cykgY2FuIGJlIGVmZmljaWVudGx5IHJldXNlZCB0aGVyZWFmdGVyLCBtYWtpbmcgdGhlbSB3ZWxsIHN1aXRlZCBmb3IgY29tcGxleCBhbmQgZnJlcXVlbnRseSBleGVjdXRlZCBvcGVyYXRpb25zLiBOYW1lZCBxdWVyaWVzIHVzZSB0aGUgSlBBIHF1ZXJ5IGxhbmd1YWdlIGZvciBwb3J0YWJsZSBleGVjdXRpb24gb24gYW55IHVuZGVybHlpbmcgZGF0YWJhc2U7IG5hbWVkIG5hdGl2ZSBxdWVyaWVzIHVzZSB0aGUgU1FMIGxhbmd1YWdlIG5hdGl2ZSB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIDxjb2RlPkBOYW1lZFF1ZXJ5PC9jb2RlPiBhbmQgPGNvZGU+QE5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+IGFubm90YXRpb25zIHRvIHRoZSBlbnRpdHkuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmFtZWQgcXVlcnk6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBleHBhbmQgUXVlcmllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gZm9yIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgaW4gdGhlIE5hbWUgZmllbGQgYW5kIHRoZW4gY2xpY2sgT0suPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMDgiIG5hbWU9InN0aHJlZjEwOCI+PC9hPjxhIGlkPSJzdGhyZWYxMDkiIG5hbWU9InN0aHJlZjEwOSI+PC9hPjxhIGlkPSJzdGhyZWYxMTAiIG5hbWU9InN0aHJlZjExMCI+PC9hPjxhIGlkPSJzdGhyZWYxMTEiIG5hbWU9InN0aHJlZjExMSI+PC9hPlRvIGFkZCBhIFF1ZXJ5IGhpbnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjExMiIgbmFtZT0ic3RocmVmMTEyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+RW50ZXJpbmcgYSBOYW1lZCBRdWVyeTwvcD4KLTxpbWcgc3JjPSJpbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmciIGFsdD0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJUaGUgUXVlcmllcyBzZWN0aW9uIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzZDA2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QmFzaWMgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQmFzaWMgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBQkNFIiBuYW1lPSJCQUJCQUJDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QmFzaWMgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTEzIiBuYW1lPSJzdGhyZWYxMTMiPjwvYT48YSBpZD0ic3RocmVmMTE0IiBuYW1lPSJzdGhyZWYxMTQiPjwvYT48YSBpZD0ic3RocmVmMTE1IiBuYW1lPSJzdGhyZWYxMTUiPjwvYT48YSBpZD0ic3RocmVmMTE2IiBuYW1lPSJzdGhyZWYxMTYiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWMgTWFwcGluZzwvc3Bhbj4gdG8gbWFwIGFuIGF0dHJpYnV0ZSBkaXJlY3RseSB0byBhIGRhdGFiYXNlIGNvbHVtbi4gQmFzaWMgbWFwcGluZ3MgbWF5IGJlIHVzZWQgb25seSB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkphdmEgcHJpbWl0aXZlIHR5cGVzIGFuZCB3cmFwcGVycyBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubGFuZy5TdHJpbmcsIGphdmEubWF0aC5CaWdJbnRlZ2VyPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLm1hdGguQmlnRGVjaW1hbDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkRhdGU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEudXRpbC5DYWxlbmRhciwgamF2YS5zcWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5ieXRlW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Y2hhcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5DaGFyYWN0ZXJbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+ZW51bXM8L3A+Ci08L2xpPgotPGxpPgotPHA+YW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIDxjb2RlPlNlcmlhbGl6YWJsZTwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRvIGNyZWF0ZSBhIGJhc2ljIG1hcHBpbmc6PC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBCYXNpYzwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+RW50aXR5IE1hcCBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMyLXQxNCI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYSA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWMgTWFwcGluZzwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQmFzaWM8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPkJhc2ljPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMi10MTQiPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUgYW5kIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SU5TRVJUPC9jb2RlPiBhbmQgPGNvZGU+VVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTQgcjFjMi10MTQiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE0IHIxYzItdDE0Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMy10MTQiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+T3B0aW9uYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNCByMWMyLXQxNCI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTQgcjFjMy10MTQiPlllczwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTQgcjFjMi10MTQiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkxvYjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgaWYgdGhpcyBpcyBhIGxhcmdlIG9iamVjdHMgKEJMT0Igb3IgQ0xPQikuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCQklCSSI+IkxvYiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9UQUJMRSZndDs8L3NwYW4+IiwgCi0gICAgaW5zZXJ0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5TRVJUQUJMRSZndDs8L3NwYW4+LCB1cGRhdGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotQEJhc2ljKGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBvcHRpb25hbCA9IDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUFRJT05BTCZndDs8L3NwYW4+KQotQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MmU4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkNCSERGIiBuYW1lPSJCQUJDQkhERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTE3IiBuYW1lPSJzdGhyZWYxMTciPjwvYT48YSBpZD0ic3RocmVmMTE4IiBuYW1lPSJzdGhyZWYxMTgiPjwvYT48YSBpZD0ic3RocmVmMTE5IiBuYW1lPSJzdGhyZWYxMTkiPjwvYT48YSBpZD0ic3RocmVmMTIwIiBuYW1lPSJzdGhyZWYxMjAiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgYSBwZXJzaXN0ZW50IGZpZWxkIG9yIHByb3BlcnR5IG9mIGFuIGVudGl0eSB3aG9zZSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBhbiBlbWJlZGRhYmxlIGNsYXNzLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHJpZ2h0LWNsaWNrIHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIGFzICZndDsgRW1iZWRkZWQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPkVudGl0eSBNYXBwaW5nIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzItdDE1Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW1iZWRkZWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMy10MTUiPkVtYmVkZGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1hcHBpbmcgb2YgYW4gZW50aXR5J3MgYXR0cmlidXRlLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5Db2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTUgcjFjMi10MTUiPlRoZSBkYXRhYmFzZSBjb2x1bW4gKGFuZCBpdHMgdGFibGUpIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5OYW1lICZuZGFzaDsgTmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSAmbmRhc2g7IE5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkCi1AQXR0cmlidXRlT3ZlcnJpZGUoY29sdW1uPUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKSkKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjJlYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgSUQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERJQUVFIiBuYW1lPSJDSUhESUFFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgSUQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTIxIiBuYW1lPSJzdGhyZWYxMjEiPjwvYT48YSBpZD0ic3RocmVmMTIyIiBuYW1lPSJzdGhyZWYxMjIiPjwvYT48YSBpZD0ic3RocmVmMTIzIiBuYW1lPSJzdGhyZWYxMjMiPjwvYT48YSBpZD0ic3RocmVmMTI0IiBuYW1lPSJzdGhyZWYxMjQiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElEIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IG9mIGFuIGVtYmVkZGVkIElELiBUaGVzZSBtYXBwaW5ncyBtYXkgYmUgdXNlZCB3aXRoIGEgPGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkZFSUNFIj5FbWJlZGRhYmxlPC9hPiBlbnRpdGllcy48L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW1iZWRkZWQgSWQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE2Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPkVudGl0eSBNYXBwaW5nIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzItdDE2Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZCBJZDwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW1iZWRkZWRJZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+RW1iZWRkZWQgSWQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBFbWJlZGRlZElkCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ZjYjZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JRCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJRCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0NCSEciIG5hbWU9IkJBQkdDQkhHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5JRCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPjxhIGlkPSJzdGhyZWYxMjYiIG5hbWU9InN0aHJlZjEyNiI+PC9hPjxhIGlkPSJzdGhyZWYxMjciIG5hbWU9InN0aHJlZjEyNyI+PC9hPjxhIGlkPSJzdGhyZWYxMjgiIG5hbWU9InN0aHJlZjEyOCI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+SUQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgb2YgYW4gZW50aXR5LiBJRCBtYXBwaW5ncyBtYXkgYmUgdXNlZCB3aXRoIGEgPGEgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+LiBFYWNoIDxhIGhyZWY9InRhc2tzMDA1Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPiBtdXN0IGhhdmUgYW4gSUQgbWFwcGluZy48L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQgY2xpY2sgdGhlIGZpbGVkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIGFzICZndDsgSUQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkVudGl0eSBNYXBwaW5nIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzItdDE3Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+SUQgTWFwcGluZzwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMy10MTciPklEPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMi10MTciPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNyByMWMzLXQxNyI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMyLXQxNyI+VGhlIGRhdGFiYXNlIHRhYmxlIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMzLXQxNyI+QnkgZGVmYXVsdCwgdGhlIFRhYmxlIGlzIGFzc3VtZWQgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE3IHIxYzItdDE3Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0VBSkdEIj4iVGVtcG9yYWwiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkRhdGU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lc3RhbXA8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE3IHIxYzMtdDE3Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgZmllbGRzIGluIDxhIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jQ0FDRkNDQUIiPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L2E+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBLIEdlbmVyYXRpb24gdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQSyBHZW5lcmF0aW9uIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMi10MTgiPlRoZXNlIGZpZWxkcyBkZWZpbmUgaG93IHRoZSBwcmltYXJ5IGtleSBpcyBnZW5lcmF0ZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPiZuYnNwOyZuYnNwO1N0cmF0ZWd5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTggcjFjMi10MTgiPlNlZSA8YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0JBSkJDIj4iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+QXV0bzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZXF1ZW5jZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZGVudGl0eTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTggcjFjMy10MTgiPkF1dG88L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4mbmJzcDsmbmJzcDtHZW5lcmF0b3ImbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTggcjFjMi10MTgiPk5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGdlbmVyYXRvciBzcGVjaWZpZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOCByMWMzLXQxOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkFkZGl0aW9uYWwgZmllbGRzIHdpbGwgYXBwZWFyIGluIHRoZSA8YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPiBhcmVhLCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIFN0cmF0ZWd5LiBTZWUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASWQKLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIsIGluc2VydGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwKLSAgICB1cGRhdGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotQFRlbXBvcmFsKDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtURU1QT1JBTCZndDs8L3NwYW4+KQotQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRvclR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NUUkFURUdZJmd0Ozwvc3Bhbj4sIGdlbmVyYXRvcj0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iKUBUYWJsZUdlbmVyYXRvcihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIsIHRhYmxlID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfVEFCTEUmZ3Q7PC9zcGFuPiIsIAotICAgIHBrQ29sdW1uTmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1BLJmd0Ozwvc3Bhbj4iLCAKLSAgICB2YWx1ZUNvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9WQUxVRV9DT0xVTU4mZ3Q7PC9zcGFuPiIsIAotICAgIHBrQ29sdW1uVmFsdWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9QS19DT0xVTU5fVkFMVUUmZ3Q7PC9zcGFuPiIpQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IiwgCi0gICAgc2VxdWVuY2VOYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFJmd0Ozwvc3Bhbj4iKQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyNzc3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUlFR0QiIG5hbWU9IkJBQkVJRUdEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW1hbnkgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTI5IiBuYW1lPSJzdGhyZWYxMjkiPjwvYT48YSBpZD0ic3RocmVmMTMwIiBuYW1lPSJzdGhyZWYxMzAiPjwvYT48YSBpZD0ic3RocmVmMTMxIiBuYW1lPSJzdGhyZWYxMzEiPjwvYT48YSBpZD0ic3RocmVmMTMyIiBuYW1lPSJzdGhyZWYxMzIiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1NYW55IE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIG1hbnktdmFsdWVkIGFzc29jaWF0aW9uIHdpdGggbWFueS10by1tYW55IG11bHRpcGxpY2l0eS4gQSBtYW55LXRvLW1hbnkgbWFwcGluZyBoYXMgdHdvIHNpZGVzOiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+b3duaW5nIHNpZGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iaXRhbGljIj5ub24tb3duaW5nIHNpZGU8L3NwYW4+LiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBqb2luIHRhYmxlIG9uIHRoZSBvd25pbmcgc2lkZS4gRm9yIGJpZGlyZWN0aW9uYWwgbWFwcGluZ3MsIGVpdGhlciBzaWRlIG1heSBiZSB0aGUgb3duaW5nIHNpZGUuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tTWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIG9mIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTkgcjFjMi10MTkiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnkgdG8gTWFueSBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5NYW55IHRvIE1hbnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMi10MTkiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzMtdDE5Ij5udWxsCi08cD5Zb3UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0YXJnZXQgZW50aXR5LCBzaW5jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTkgcjFjMy10MTkiPkxhenk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMyLXQxOSI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTkgcjFjMy10MTkiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+WW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuCi08cD5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VG8gYWRkIGEgbmV3IEpvaW4gb3IgSW52ZXJzZSBKb2luIENvbHVtbiwgY2xpY2sgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGQ8L3NwYW4+LjwvcD4KLTxwPlRvIGVkaXQgYW4gZXhpc3RpbmcgSm9pbiBvciBJbnZlcnNlIEpvaW4gQ29sdW1uLCBzZWxlY3QgdGhlIGZpZWxkIHRvIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkVkaXQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iKQotQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LAotICAgIHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKQotQE9yZGVyQnkoIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUkRFUl9CWSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyNWJiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFueS10by1vbmUgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhGQUZKIiBuYW1lPSJCQUJIRkFGSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFueS10by1vbmUgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTMzIiBuYW1lPSJzdGhyZWYxMzMiPjwvYT48YSBpZD0ic3RocmVmMTM0IiBuYW1lPSJzdGhyZWYxMzQiPjwvYT48YSBpZD0ic3RocmVmMTM1IiBuYW1lPSJzdGhyZWYxMzUiPjwvYT48YSBpZD0ic3RocmVmMTM2IiBuYW1lPSJzdGhyZWYxMzYiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1PbmU8L3NwYW4+IG1hcHBpbmcgdG8gZGVmaW5lcyBhIHNpbmdsZS12YWx1ZWQgYXNzb2NpYXRpb24gdG8gYW5vdGhlciBlbnRpdHkgY2xhc3MgdGhhdCBoYXMgbWFueS10by1vbmUgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBNYW55LXRvLU9uZTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpb24gdGhlIEdlbmVyYWwgdGFiIGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMi10MjEiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1PbmU8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATWFueVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzMtdDIxIj5NYW55LXRvLU9uZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMyLXQyMSI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjEgcjFjMy10MjEiPm51bGwKLTxwPllvdSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBlbnRpdHksIHNpbmNlIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMi10MjEiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMzLXQyMSI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5DYXNjYWRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMi10MjEiPlNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNKQUlIQiI+IkNhc2NhZGUgVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGVmYXVsdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BbGw8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyc2lzdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NZXJnZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIxIHIxYzMtdDIxIj5EZWZhdWx0PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+T3B0aW9uYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMyLXQyMSI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMy10MjEiPlllczwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgb24gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gdGFiIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIyIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMyLXQyMiI+PGEgaWQ9InN0aHJlZjEzNyIgbmFtZT0ic3RocmVmMTM3Ij48L2E+PGEgaWQ9InN0aHJlZjEzOCIgbmFtZT0ic3RocmVmMTM4Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMy10MjIiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEpvaW5UYWJsZShqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU4mZ3Q7PC9zcGFuPiIpLCAKLSAgICBuYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIpCi1ATWFueVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBmZXRjaD08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBjYXNjYWRlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzU4MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9uZS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9uZS10by1tYW55IG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJIR0VCRCIgbmFtZT0iQkFCSEdFQkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk9uZS10by1tYW55IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEzOSIgbmFtZT0ic3RocmVmMTM5Ij48L2E+PGEgaWQ9InN0aHJlZjE0MCIgbmFtZT0ic3RocmVmMTQwIj48L2E+PGEgaWQ9InN0aHJlZjE0MSIgbmFtZT0ic3RocmVmMTQxIj48L2E+PGEgaWQ9InN0aHJlZjE0MiIgbmFtZT0ic3RocmVmMTQyIj48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1NYW55IE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIHJlbGF0aW9uc2hpcCB3aXRoIG9uZS10by1tYW55IG11bHRpcGxpY2l0eS48L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgT25lLXRvLW1hbnk8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+TWFwcGluZyBFbnRpdHkgVHlwZSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMyByMWMyLXQyMyI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tTWFueTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBPbmVUb01hbnk8L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMy10MjMiPk9uZS10by1NYW55PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIzIHIxYzItdDIzIj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMyByMWMzLXQyMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+Q2FzY2FkZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIzIHIxYzItdDIzIj5TZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDSkFJSEIiPiJDYXNjYWRlIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkRlZmF1bHQ8L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsPC9wPgotPC9saT4KLTxsaT4KLTxwPlBlcnNpc3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+TWVyZ2U8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVtb3ZlPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMyByMWMzLXQyMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMyByMWMyLXQyMyI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIzIHIxYzMtdDIzIj5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIzIHIxYzItdDIzIj5UaGUgZGF0YWJhc2UgZmllbGQgdGhhdCBvd25zIHRoZSByZWxhdGlvbnNoaXAuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPk9yZGVyIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjMgcjFjMi10MjMiPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5LiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDREFESUgiPiJPcmRlciBCeSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+Tm8gb3JkZXJpbmc8L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXk8L3A+Ci08L2xpPgotPGxpPgotPHA+Q3VzdG9tPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyMyByMWMzLXQyMyI+Tm8gb3JkZXJpbmc8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzItdDI0Ij5OYW1lIG9mIHRoZSBqb2luIHRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjQgcjFjMy10MjQiPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+U3BlY2lmeSB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgcHJpbWFyeSBrZXkpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI0IHIxYzMtdDI0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5JbnZlcnNlIEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI0IHIxYzItdDI0Ij5UaGUgam9pbiBjb2x1bW4gb24gdGhlIG93bmVkIChvciBpbnZlcnNlKSBzaWRlIG9mIHRoZSBhc3NvY2lhdGlvbjogdGhlIG93bmVkIGVudGl0eSdzIHByaW1hcnkga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AT25lVG9NYW55KHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+KQotQENvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OJmd0Ozwvc3Bhbj4iKQotCi0KLUBPbmVUb01hbnkodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4uY2xhc3MsIGNhc2NhZGU9Q2FzY2FkZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBmZXRjaCA9IEZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKUBPcmRlckJ5KCI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1JERVJfQlkmZ3Q7PC9zcGFuPiIpCi1ASm9pblRhYmxlKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9Ci0gICAgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlZFUlNFX0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IikpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDY3N2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9uZS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkhCQ0oiIG5hbWU9IkJBQkZIQkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0MyIgbmFtZT0ic3RocmVmMTQzIj48L2E+PGEgaWQ9InN0aHJlZjE0NCIgbmFtZT0ic3RocmVmMTQ0Ij48L2E+PGEgaWQ9InN0aHJlZjE0NSIgbmFtZT0ic3RocmVmMTQ1Ij48L2E+PGEgaWQ9InN0aHJlZjE0NiIgbmFtZT0ic3RocmVmMTQ2Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1PbmUgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgcmVsYXRpb25zaGlwIHdpdGggb25lLXRvLW1hbnkgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMyLXQyNSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lPC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9uZVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij5PbmUtdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzItdDI1Ij5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjUgcjFjMy10MjUiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+PGEgaWQ9InN0aHJlZjE0NyIgbmFtZT0ic3RocmVmMTQ3Ij48L2E+PGEgaWQ9InN0aHJlZjE0OCIgbmFtZT0ic3RocmVmMTQ4Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMy10MjYiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IikKLUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0KLSAgICAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgCi0gICAgdXBkYXRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDk1MjQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRyYW5zaWVudCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUcmFuc2llbnQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhGSEVJIiBuYW1lPSJCQUJIRkhFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VHJhbnNpZW50IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0OSIgbmFtZT0ic3RocmVmMTQ5Ij48L2E+PGEgaWQ9InN0aHJlZjE1MCIgbmFtZT0ic3RocmVmMTUwIj48L2E+PGEgaWQ9InN0aHJlZjE1MSIgbmFtZT0ic3RocmVmMTUxIj48L2E+PGEgaWQ9InN0aHJlZjE1MiIgbmFtZT0ic3RocmVmMTUyIj48L2E+VXNlIHRoZSBUcmFuc2llbnQgTWFwcGluZyB0byBzcGVjaWZ5IGEgZmllbGQgb2YgdGhlIGVudGl0eSBjbGFzcyB0aGF0IDxzcGFuIGNsYXNzPSJpdGFsaWMiPmlzIG5vdDwvc3Bhbj4gcGVyc2lzdGVudC48L3A+Ci08cD5UbyBjcmVhdGUgYSB0cmFuc2llbnQgbWFwcGluZzo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzIFRyYW5zaWVudDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9uIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AVHJhbnNpZW50Ci08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTFiZDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5WZXJzaW9uIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlZlcnNpb24gbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhJQklJIiBuYW1lPSJCQUJISUJJSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VmVyc2lvbiBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNTMiIG5hbWU9InN0aHJlZjE1MyI+PC9hPjxhIGlkPSJzdGhyZWYxNTQiIG5hbWU9InN0aHJlZjE1NCI+PC9hPjxhIGlkPSJzdGhyZWYxNTUiIG5hbWU9InN0aHJlZjE1NSI+PC9hPjxhIGlkPSJzdGhyZWYxNTYiIG5hbWU9InN0aHJlZjE1NiI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5WZXJzaW9uIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy4gSWYgdGhlIGVudGl0eSBpcyBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgdGFibGVzLCB5b3Ugc2hvdWxkIHVzZSBhIHZlcnNpb24gbWFwcGluZyBvbmx5IHdpdGggdGhlIHByaW1hcnkgdGFibGUuIFlvdSBzaG91bGQgaGF2ZSBvbmx5IGEgc2luZ2xlIHZlcnNpb24gbWFwcGluZyBwZXIgcGVyc2lzdGVudCBlbnRpdHkuIFZlcnNpb24gbWFwcGluZ3MgbWF5IGJlIHVzZWQgb25seSB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxjb2RlPmludDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+SW50ZWdlcjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+c2hvcnQsIFNob3J0PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5sb25nLCBMb25nPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UbyBjcmVhdGUgYSB2ZXJzaW9uIG1hcHBpbmc6PC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IFZlcnNpb248L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM4JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5NYXBwZWQgRW50aXR5IEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI3IHIxYzItdDI3Ij5EZWZpbmVzIHRoZSBtYXBwaW5nIGFzIFZlcnNpb24uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBWZXJzaW9uPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI3IHIxYzMtdDI3Ij5WZXJzaW9uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjcgcjFjMi10MjciPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNyByMWMzLXQyNyI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUgYW5kIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SU5TRVJUPC9jb2RlPiBhbmQgPGNvZGU+VVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjcgcjFjMi10MjciPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLiBUaGlzIG11c3QgYmUgdGhlIHByaW1hcnkgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUncyBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjcgcjFjMy10MjciPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjcgcjFjMi10MjciPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjcgcjFjMy10MjciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFZlcnNpb24KLUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWU9IiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5DT0xVTU5fTkFNRTwvc3Bhbj4mZ3Q7IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViZGJmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkFHRkkiIG5hbWU9IkJBQkJBR0ZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE1NyIgbmFtZT0ic3RocmVmMTU3Ij48L2E+PGEgaWQ9InN0aHJlZjE1OCIgbmFtZT0ic3RocmVmMTU4Ij48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGdlbmVyYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBmcm9tIGRhdGFiYXNlIHRhYmxlcy4gWW91IG11c3QgY3JlYXRlIGEgSlBBIHByb2plY3QgYW5kIGVzdGFibGlzaCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gPHNwYW4gY2xhc3M9Iml0YWxpYyI+YmVmb3JlPC9zcGFuPiBnZW5lcmF0aW5nIHBlcnNpc3RlbnQgZW50aXRpZXMuIFNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjxhIGlkPSJzdGhyZWYxNTkiIG5hbWU9InN0aHJlZjE1OSI+PC9hPjxhIGlkPSJzdGhyZWYxNjAiIG5hbWU9InN0aHJlZjE2MCI+PC9hPjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5KUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlczwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYxIiBuYW1lPSJzdGhyZWYxNjEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5HZW5lcmF0aW5nIEVudGl0aWVzPC9wPgotPGltZyBzcmM9ImltZy9nZW5lcmF0ZV9lbnRpdGllcy5wbmciIGFsdD0iVXNpbmcgdGhlIEpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIEVudGl0aWVzIG1lbnUgb3B0aW9uLiIgdGl0bGU9IlVzaW5nIHRoZSBKUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBtZW51IG9wdGlvbi4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jQ0lBSENHRUUiPlNlbGVjdCBUYWJsZXM8L2E+IHBhZ2UsIHNlbGVjdCB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNjaGVtYS48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgZGF0YWJhc2UgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBjb25uZWN0aW9uPC9zcGFuPi48L3A+Ci08cD5JZiB5b3UgYXJlIG5vdCBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBkYXRhYmFzZSwgdGhlIERhdGFiYXNlIENvbm5lY3Rpb24gcGFnZSBhcHBlYXJzLiBTZWxlY3QgeW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+UmVjb25uZWN0PC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjIiIG5hbWU9InN0aHJlZjE2MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNlbGVjdCBUYWJsZXM8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF90YWJsZXMucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkFmdGVyIHNlbGVjdGluZyBhIHNjaGVtYSwgc2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiPlRhYmxlIEFzc29jaWF0aW9uczwvYT4gcGFnZSwgc2VsZWN0IHRoZSBhc3NvY2lhdGlvbnMgdG8gZ2VuZXJhdGUuIFlvdSBjYW4gc3BlY2lmeSB0byBnZW5lcmF0ZSBzcGVjaWZpYyByZWZlcmVuY2VzIGZvciBlYWNoIGFzc29jaWF0aW9uLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBBc3NvY2lhdGlvbjwvc3Bhbj4uIFVzZSB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT4gd2l6YXJkIHRvIGRlZmluZSB0aGUgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYzIiBuYW1lPSJzdGhyZWYxNjMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UYWJsZSBBc3NvY2lhdGlvbnM8L3A+Ci08aW1nIHNyYz0iaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+QWZ0ZXIgZWRpdGluZyB0aGUgdGFibGUgYXNzb2NpYXRpb25zLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI0NJQUVKREJFIj5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvYT4gcGFnZSwgY3VzdG9taXplIHRoZSBtYXBwaW5nIGFuZCBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBnZW5lcmF0ZWQgZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NCIgbmFtZT0ic3RocmVmMTY0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L3A+Ci08aW1nIHNyYz0iaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5BZnRlciBjdXN0b21pemluZyB0aGUgbWFwcGluZ3MsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jQ0lBQ0lHRUUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9hPiBwYWdlLCByZXZpZXcgdGhlIG1hcHBpbmcgYW5kIGNsYXNzIGluZm9ybWF0aW9uIGZvciBlYWNoIGVudGl0eSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NSIgbmFtZT0ic3RocmVmMTY1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXM8L3A+Ci08aW1nIHNyYz0iaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBjcmVhdGVzIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSBmb3IgZWFjaCBkYXRhYmFzZSB0YWJsZS4gRWFjaCBlbnRpdHkgY29udGFpbnMgZmllbGRzIGJhc2VkIG9uIHRoZSB0YWJsZSdzIGNvbHVtbnMuIEVjbGlwc2Ugd2lsbCBhbHNvIGdlbmVyYXRlIGVudGl0eSByZWxhdGlvbnNoaXBzIChzdWNoIGFzIG9uZS10by1vbmUpIGJhc2VkIG9uIHRoZSB0YWJsZSBjb25zdHJhaW50cy4gPGEgaHJlZj0iI0NJSEpJSkpDIj5GaWd1cmU6IEdlbmVyYXRpbmcgRW50aXRpZXMgZnJvbSBUYWJsZXM8L2E+IGlsbHVzdHJhdGVzIGhvdyBFY2xpcHNlIGdlbmVyYXRlcyBlbnRpdGllcyBmcm9tIHRhYmxlcy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJDSUhKSUpKQyIgbmFtZT0iQ0lISklKSkMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5HZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy90YWJsZV9lbnRpdHkucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEVNUExPWUVFIGFuZCBBRERSRVNTIGVudGl0aWVzIGdlbmVyYXRlZCBmcm9tIGRhdGFiYXNlIHRhYmxlcy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5MGVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lISklHQkUiIG5hbWU9IkNJSEpJR0JFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC9oMT4KLTxwPldoZW4gdXNpbmcgYSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0sIHlvdSBjYW4gY3JlYXRlIGEgRERMIHNjcmlwdCBmcm9tIHlvdXIgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBEREwgc2NyaXB0IHdpdGggRFJPUCBleGlzdGluZyB0YWJsZXMgb24gdGhlIGRhdGFiYXNlIGFuZCBDUkVBVEUgbmV3IHRhYmxlcywgYmFzZWQgb24gdGhlIGVudGl0aWVzIGluIHlvdXIgcHJvamVjdC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIGdlbmVyYXRlIGEgRERMIHNjcmlwdDo8L3A+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXM8L3NwYW4+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjNhM2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQUlCQSIgbmFtZT0iQkFCRkFJQkEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPjxhIGlkPSJzdGhyZWYxNjciIG5hbWU9InN0aHJlZjE2NyI+PC9hPjxhIGlkPSJzdGhyZWYxNjgiIG5hbWU9InN0aHJlZjE2OCI+PC9hPjxhIGlkPSJzdGhyZWYxNjkiIG5hbWU9InN0aHJlZjE2OSI+PC9hPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwcGluZ3MgYXJlIGluZGljYXRlZCB3aXRoIGEgcmVkIGVycm9yIG9yIHllbGxvdyB3YXJuaW5nIG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzIHRoZSBwYXJlbnQgY29udGFpbmVycyB1cCB0byB0aGUgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNzAiIG5hbWU9InN0aHJlZjE3MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNhbXBsZSBFcnJvcnMgYW5kIFdhcm5pbmdzPC9wPgotPGltZyBzcmM9ImltZy9lcnJvcl9zYW1wbGUucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHNhbXBsZSBlcnJvciBhbmQgd2FybmluZyBpY29ucyBpbiB0aGUgRXhwbG9yZXIgdmlldy4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyBzYW1wbGUgZXJyb3IgYW5kIHdhcm5pbmcgaWNvbnMgaW4gdGhlIEV4cGxvcmVyIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIyLmh0bSNDSUhGRURFSSI+RXJyb3IgbWVzc2FnZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIzLmh0bSNDSUhHRUFJSiI+V2FybmluZyBtZXNzYWdlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM5Zjc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFcnJvciBtZXNzYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEZFREVJIiBuYW1lPSJDSUhGRURFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RXJyb3IgbWVzc2FnZXM8YSBpZD0ic3RocmVmMTcxIiBuYW1lPSJzdGhyZWYxNzEiPjwvYT48L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGVycm9yIG1lc3NhZ2VzIChpbmNsdWRpbmcgaG93IHRvIHJlc29sdmUgdGhlIGlzc3VlKSB5b3UgbWF5IGVuY291bnRlciB3aGlsZSB3b3JraW5nIHdpdGggRGFsaS48L3A+Ci08YSBpZD0ic3RocmVmMTcyIiBuYW1lPSJzdGhyZWYxNzIiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QXR0cmlidXRlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7QVRUUklCVVRFX19OQU1FJmd0Ozwvc3Bhbj4iIGhhcyBpbnZhbGlkIG1hcHBpbmcgdHlwZSBpbiB0aGlzIGNvbnRleHQ8L3A+Ci08cD5UaGUgbWFwcGVkIGF0dHJpYnV0ZSBpcyBpbnZhbGlkLiBFaXRoZXIgY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUgb3IgY2hhbmdlIHRoZSBlbnRpdHkgdHlwZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+Ik1hcHBpbmcgYW4gZW50aXR5IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3MyIgbmFtZT0ic3RocmVmMTczIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5EYWxpIGNhbm5vdCBtYXAgdGhlIGF0dHJpYnV0ZSB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb2x1bW4uIFZlcmlmeSB0aGF0IHlvdSBkYXRhYmFzZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGlzIGNvcnJlY3QuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3NCIgbmFtZT0ic3RocmVmMTc0Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkNsYXNzICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0xBU1NfTkFNRSZndDs8L3NwYW4+IiBpcyBub3QgYW5ub3RhdGVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy48L3A+Ci08cD5UaGUgY2xhc3MgaGFzIG5vdCBiZWVuIGlkZW50aWZpZWQgYXMgYSBwZXJzaXN0ZW50IGNsYXNzLiBDb25maWd1cmUgdGhlIGNsYXNzIGFzIGFuIEVudGl0eSwgTWFwcGVkIFN1cGVyY2xhc3MsIG9yIEVtYmVkZGFibGUgcGVyc2lzdGVudCBlbnRpdHkuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIjwvYT4uPC9wPgotPGEgaWQ9InN0aHJlZjE3NSIgbmFtZT0ic3RocmVmMTc1Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkNvbHVtbiAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5Zb3UgbWFwcGVkIGFuIGVudGl0eSdzIGZpZWxkIHRvIGFuIGluY29ycmVjdCBvciBpbnZhbGlkIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2UgdGFibGUuIEJ5IGRlZmF1bHQsIERhbGkgd2lsbCBhdHRlbXB0IHRvIG1hcCBlYWNoIGZpZWxkIGluIHRoZSBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBJZiB0aGUgZmllbGQncyBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgcm93J3MgbmFtZSwgeW91IG11c3QgZXhwbGljaXRseSBjcmVhdGUgdGhlIG1hcHBpbmcuPC9wPgotPHA+TWFwIHRoZSBmaWVsZCB0byBhIHZhbGlkIHJvdyBpbiB0aGUgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+Ik1hcHBpbmcgYW4gZW50aXR5IjwvYT4uPC9wPgotPGEgaWQ9InN0aHJlZjE3NiIgbmFtZT0ic3RocmVmMTc2Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkR1cGxpY2F0ZSBjbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIuPC9wPgotPHA+WW91IGNyZWF0ZWQgdG8gcGVyc2lzdGVuY2UgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUuIEVhY2ggSmF2YSBjbGFzcyBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4gU2VlIDxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE3NyIgbmFtZT0ic3RocmVmMTc3Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkVudGl0eSBkb2VzIG5vdCBoYXZlIGFuIElkIG9yIEVtYmVkZGVkIElkLjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aG91dCBpZGVudGlmeWluZyBpdHMgcHJpbWFyeSBrZXkuIEEgcGVyc2lzdGVudCBlbnRpdHkgbXVzdCBoYXZlIGEgcHJpbWFyeSBrZXkgZmllbGQgZGVzaWduYXRlZCB3aXRoIGFuIDxjb2RlPkBJZDwvY29kZT4gb3IgPGNvZGU+QEVtYmVkZGVkSWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+QWRkIGFuIElEIG1hcHBpbmcgdG8gdGhlIGVudGl0eSBhcyBzaG93biBpbiA8YSBocmVmPSJ0YXNrczAxMi5odG0jQkFCR0NCSEciPiJJRCBtYXBwaW5nIjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMTEuaHRtI0NJSERJQUVFIj4iRW1iZWRkZWQgSUQgbWFwcGluZyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzgiIG5hbWU9InN0aHJlZjE3OCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5NdWx0aXBsZSBwZXJzaXN0ZW5jZS54bWwgZmlsZXMgaW4gcHJvamVjdC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIEpQQSBwcm9qZWN0IHdpdGggbW9yZSB0aGFuIG9uZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIEVhY2ggSlBBIHByb2plY3QgbXVzdCBjb250YWluIGEgPHNwYW4gY2xhc3M9Iml0YWxpYyI+c2luZ2xlPC9zcGFuPiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzkiIG5hbWU9InN0aHJlZjE3OSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZSB1bml0IGRlZmluZWQuPC9wPgotPHA+VGhlcmUgaXMgbm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIFVzZSB0aGUgJmx0O3BlcnNpc3RlbmNlLXVuaXQgbmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1BFUlNJU1RFTkNFX1VOSVRfTkFNRSZndDs8L3NwYW4+IiB0YWcgdG8gZGVmaW5lIHRoZSBwZXJzaXN0ZW50IHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MCIgbmFtZT0ic3RocmVmMTgwIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPk5vIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgxIiBuYW1lPSJzdGhyZWYxODEiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+UmVmZXJlbmNlZCBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBpbiBqb2luIGNvbHVtbiAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5UaGUgY29sdW1uIHRoYXQgeW91IHNlbGVjdGVkIHRvIGpvaW4gYSByZWxhdGlvbnNoaXAgbWFwcGluZyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZGF0YWJhc2UgdGFibGUuIEVpdGhlciBzZWxlY3QgYSBkaWZmZXJlbnQgY29sdW1uIG9uIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI0NBQ0JBRUJDIj5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9hPiBvciBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb2x1bW4gb24gdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj4iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MiIgbmFtZT0ic3RocmVmMTgyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlNjaGVtYSAiJmx0OzxzcGFuIGNsYXNzPSJpdGFsaWMiPlNDSEVNQV9OQU1FPC9zcGFuPiZndDsiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGUvam9pbiB0YWJsZSAiJmx0OzxzcGFuIGNsYXNzPSJpdGFsaWMiPlRBQkxFX05BTUU8L3NwYW4+Jmd0OyIuPC9wPgotPHA+RGVmaW5lIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHNjaGVtYSBpbmZvcm1hdGlvbiBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgzIiBuYW1lPSJzdGhyZWYxODMiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VGFibGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iIGNhbm5vdCBiZSByZXNvbHZlZC48L3A+Ci08cD5Zb3UgYXNzb2NpYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGFuIGluY29ycmVjdCBvciBpbnZhbGlkIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBhc3NvY2lhdGUgZWFjaCBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIGFuIGlkZW50aWNhbGx5IG5hbWVkIGRhdGFiYXNlIHRhYmxlLiBJZiB0aGUgZW50aXR5J3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHRhYmxlJ3MgbmFtZSwgeW91IG11c3QgZXhwbGljaXRseSBjcmVhdGUgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTxwPkFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSB2YWxpZCBkYXRhYmFzZSB0YWJsZSBhcyBzaG93biBpbiA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxODQiIG5hbWU9InN0aHJlZjE4NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5VbnJlc29sdmVkIGdlbmVyYXRvciAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIGRlZmluZWQgaW4gcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbmNlIGVudGl0eSB0aGF0IHVzZXMgc2VxdWVuY2luZyBvciBhIHRhYmxlIGdlbmVyYXRvciwgYnV0IGRpZCBub3QgZGVmaW5lIHRoZSBnZW5lcmF0b3IgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEVpdGhlciBkZWZpbmUgdGhlIGdlbmVyYXRvciBieSB1c2luZyBhbiBhbm5vdGF0aW9uIG9yIGluY2x1ZGluZyBpdCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3ByYnZpZXcuaHRtIj5Qcm9ibGVtcyB2aWV3PC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGE1YTg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPldhcm5pbmcgbWVzc2FnZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhHRUFJSiIgbmFtZT0iQ0lIR0VBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldhcm5pbmcgbWVzc2FnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHdhcm5pbmcgbWVzc2FnZXMgKGluY2x1ZGluZyBob3cgdG8gcmVzb2x2ZSB0aGUgaXNzdWUpIHlvdSBtYXkgZW5jb3VudGVyIHdoaWxlIHdvcmtpbmcgd2l0aCBEYWxpLjwvcD4KLTxhIGlkPSJzdGhyZWYxODUiIG5hbWU9InN0aHJlZjE4NSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db25uZWN0aW9uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09OTkVDVElPTl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIG5vdCBhY3RpdmUuIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHlvdSBzcGVjaWZpZWQgdG8gdXNlIHdpdGggdGhlIEpQQSBwcm9qZWN0IGlzIG5vdCBhY3RpdmUuIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTg2IiBuYW1lPSJzdGhyZWYxODYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gY29ubmVjdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBwcm9qZWN0LiBObyBkYXRhLXNwZWNpZmljIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLiBUaGUgSlBBIHByb2plY3QgcmVxdWlyZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMjQuaHRtI0JBQkRCQ0JJIj4iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTY1N2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQkNCSSIgbmFtZT0iQkFCREJDQkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvaDE+Ci08cD5FYWNoIHBlcnNpc3RlbnQgcHJvamVjdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uIFRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkRhdGFiYXNlIENvbm5lY3Rpb248L3NwYW4+IHVzZSB0aGUgTmV3IENvbm5lY3Rpb24gd2l6YXJkLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBtb2RpZnkgdGhlIHZlbmRlci1zcGVjaWZpYyBwbGF0Zm9ybSBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggeW91ciBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkV4cGxvcmVyPC9zcGFuPiB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9wZXJ0aWVzPC9zcGFuPi4gVGhlIFByb3BlcnRpZXMgcGFnZSBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE4NyIgbmFtZT0ic3RocmVmMTg3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFByb3BlcnRpZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyIgYWx0PSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIHRpdGxlPSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSBlYWNoIGZpZWxkIG9uIHRoZSA8YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+IGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjMwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGlwcyBhbmQgdHJpY2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGlwcyBhbmQgdHJpY2tzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hESEdIQkYiIG5hbWU9IkNIREhHSEJGIj48L2E+PC9wPgotPGgxPlRpcHMgYW5kIHRyaWNrczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRpcHMgYW5kIHRyaWNrcyBnaXZlIHNvbWUgaGVscGZ1bCBpZGVhcyBmb3IgaW5jcmVhc2luZyB5b3VyIHByb2R1Y3Rpdml0eS48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSIjQkFCRklJSEEiPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZSBDb25uZWN0aW9uczwvc3Bhbj48L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IiNCQUJDSEFIRiI+PHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYS1iYXNlZCBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgdGlwcyBhbmQgdHJpY2tzIGluIHRoaXMgY2F0ZWdvcnkuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSB0aXBzIGFuZCB0cmlja3MgaW4gdGhpcyBjYXRlZ29yeS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjclIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIiPlRpcDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPjxhIGlkPSJCQUJGSUlIQSIgbmFtZT0iQkFCRklJSEEiPjwvYT48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2UgQ29ubmVjdGlvbnM8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MiByMWMyLXQyIj5XaGVuIHN0YXJ0aW5nIGEgbmV3IHdvcmtiZW5jaCBzZXNzaW9uLCBiZSBzdXJlIHRvIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZG9jLnVzZXIvZG9jL2h0bWwvYXNjMTIyOTcwMDM0MzM1Mi5odG1sIj5yZWNvbm5lY3QgdG8geW91ciBkYXRhYmFzZTwvYT4gKGlmIHlvdSBhcmUgd29ya2luZyBvbmxpbmUpLiBUaGlzIGFsbG93cyBEYWxpIHRvIHByb3ZpZGUgZGF0YWJhc2UtcmVsYXRlZCBtYXBwaW5nIGFzc2lzdGFuY2UgYW5kIHZhbGlkYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPjxhIGlkPSJCQUJDSEFIRiIgbmFtZT0iQkFCQ0hBSEYiPjwvYT48c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hLWJhc2VkIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzItdDIiPklmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwsIHlvdSBtYXkgbmVlZCB0byBjb25maWd1cmUgeW91ciBFY2xpcHNlIHdvcmtzcGFjZSBwcm94eSBpbiB0aGUgPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi03Mi5odG0iPlByZWZlcmVuY2VzIGRpYWxvZzwvYT4gKDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJlZmVyZW5jZXMgJmd0OyBJbnRlcm5ldCAmZ3Q7IFByb3h5IFNldHRpbmdzPC9zcGFuPikgdG8gcHJvcGVybHkgdmFsaWRhdGUgYSBzY2hlbWEtYmFzZWQgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1MWNjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08IS0tIFVzZXIgR3VpZGUgLS0+Ci0gIDx0b2MgbGFiZWw9IkRhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBVc2VyIEd1aWRlIj4KLSAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkLmh0bSIgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCI+Ci0gICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNCQUJFRkhDRCIgbGFiZWw9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jQkFCSUdDSkEiIGxhYmVsPSJEYWxpIHF1aWNrIHN0YXJ0Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jQkFCREZIREEiIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jQkFCRkdEREciIGxhYmVsPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgaHJlZj0iY29uY2VwdHMuaHRtIiBsYWJlbD0iIENvbmNlcHRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciIGxhYmVsPSJVbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEkiPgotICAgICAgICA8dG9waWMgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIiBsYWJlbD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0iY29uY2VwdHMwMDMuaHRtI0NIREJJSkFDIiBsYWJlbD0iVGhlIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgaHJlZj0idGFza3MuaHRtIiBsYWJlbD0iIFRhc2tzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jQkVJQkFESEgiIGxhYmVsPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciIGxhYmVsPSJDcmVhdGluZyBhIEpQQSBFbnRpdHkiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIiBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNDSUhGRUJBSSIgbGFiZWw9IlN5bmNocm9uaXppbmcgY2xhc3NlcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDMuaHRtI3N0aHJlZjU5IiBsYWJlbD0iQ3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDQuaHRtI0NJSEJDRENFIiBsYWJlbD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIiBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI0JBQkdCSUVFIiBsYWJlbD0iRW50aXR5IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI0JBQkZFSUNFIiBsYWJlbD0iRW1iZWRkYWJsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJEQUdDSSIgbGFiZWw9Ik1hcHBlZCBzdXBlcmNsYXNzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIiBsYWJlbD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCIgbGFiZWw9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJJR0JHRyIgbGFiZWw9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiIgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJCQUJDRSIgbGFiZWw9IkJhc2ljIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jQkFCQ0JIREYiIGxhYmVsPSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI0NJSERJQUVFIiBsYWJlbD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNCQUJHQ0JIRyIgbGFiZWw9IklEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jQkFCRUlFR0QiIGxhYmVsPSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJIRkFGSiIgbGFiZWw9Ik1hbnktdG8tb25lIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEdFQkQiIGxhYmVsPSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI0JBQkZIQkNKIiBsYWJlbD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI0JBQkhGSEVJIiBsYWJlbD0iVHJhbnNpZW50IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jQkFCSElCSUkiIGxhYmVsPSJWZXJzaW9uIG1hcHBpbmciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJCQUdGSSIgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjAuaHRtI0NJSEpJR0JFIiBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jQkFCRkFJQkEiIGxhYmVsPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI0NJSEZFREVJIiBsYWJlbD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jQ0lIR0VBSUoiIGxhYmVsPSJXYXJuaW5nIG1lc3NhZ2VzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyNC5odG0jQkFCREJDQkkiIGxhYmVsPSJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgbGFiZWw9IiBSZWZlcmVuY2UiPgotICAgICAgPHRvcGljIGxhYmVsPSJXaXphcmRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyIgbGFiZWw9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2phdmFfcGFnZS5odG0jQ0lBR0VCQUEiIGxhYmVsPSJKYXZhIFBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIiBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiIgbGFiZWw9IkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIiBsYWJlbD0iRW50aXR5IENsYXNzIHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiIGxhYmVsPSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSIgbGFiZWw9Ik1hcHBpbmcgRmlsZSBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDMuaHRtI0NJQUpFSURKIiBsYWJlbD0iTWFwcGluZyBGaWxlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSIgbGFiZWw9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiIGxhYmVsPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNDSUFIQ0dFRSIgbGFiZWw9IlNlbGVjdCBUYWJsZXMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiIGxhYmVsPSJUYWJsZSBBc3NvY2lhdGlvbnMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSNDSUFDSUdFRSIgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiIgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIiBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNDSUFFR0VFRyIgbGFiZWw9IkpvaW4gQ29sdW1ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSNDSUFGSUlGSCIgbGFiZWw9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5IiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvcGVydHkgcGFnZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giIGxhYmVsPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIiBsYWJlbD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIiBsYWJlbD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMC5odG0jc3RocmVmMjI2IiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiIGxhYmVsPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIiBsYWJlbD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIiBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI0NBQ0NBQ0dIIiBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNFQUdCRyIgbGFiZWw9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiIGxhYmVsPSJHZW5lcmF0b3JzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTYuaHRtI0NJQUlCQUFKIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE3Lmh0bSNDSUFER0NJRCIgbGFiZWw9IkNvbnZlcnRlcnMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIiBsYWJlbD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiIgbGFiZWw9IkdlbmVyYWwiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiIGxhYmVsPSJDb25uZWN0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUpBRkVHIiBsYWJlbD0iQ3VzdG9taXphdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFCRURDSCIgbGFiZWw9IkNhY2hpbmciIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiIGxhYmVsPSJMb2dnaW5nIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUZKQ0hFIiBsYWJlbD0iT3B0aW9ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFDQ0ZDQiIgbGFiZWw9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIiBsYWJlbD0iUHJvcGVydGllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCIgbGFiZWw9IlNvdXJjZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByZWZlcmVuY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJEaWFsb2dzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDQ0dFSEMiIGxhYmVsPSJFZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSNDSUFGREdJSiIgbGFiZWw9IlNlbGVjdCBDYXNjYWRlIGRpYWxvZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtI0NJQUVERUpGIiBsYWJlbD0iTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfYWRkX2NvbnZlcnRlci5odG0jQ0lBR0NHSUoiIGxhYmVsPSJBZGQgQ29udmVydGVyIGRpYWxvZyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiIgbGFiZWw9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSIgLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iSWNvbnMgYW5kIGJ1dHRvbnMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNHRUFDRyIgbGFiZWw9Ikljb25zIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDMxLmh0bSNDQUNESkNFSSIgbGFiZWw9IkJ1dHRvbnMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDQkJESUIiIGxhYmVsPSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRpcHNfYW5kX3RyaWNrcy5odG0iIGxhYmVsPSJUaXBzIGFuZCB0cmlja3MiPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMS5odG0jQ0pBQ0VEREUiIGxhYmVsPSJKUEEgTGlicmFyeSBNYW5hZ2VtZW50IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQ0pBRElGSEoiIGxhYmVsPSJOZXcgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMy5odG0jQ0pBQklKRUMiIGxhYmVsPSJDb252ZXJzaW9uIG9mIEphdmEgUHJvamVjdHMgdG8gSlBBIFByb2plY3RzIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQ0pBQ0pCREEiIGxhYmVsPSJFY2xpcHNlTGluayAxLjEgU3VwcG9ydCIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDUuaHRtI3N0aHJlZjI4NiIgbGFiZWw9IlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZSIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJsZWdhbC5odG0iIGxhYmVsPSIgTGVnYWwiPgotICAgICAgPHRvcGljIGhyZWY9ImFib3V0Lmh0bSNzdGhyZWYyODgiIGxhYmVsPSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci0gICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwYWFjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2hhdCdzIG5ldzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFdoYXQncyBuZXciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyODUiIG5hbWU9InN0aHJlZjI4NSI+PC9hPiBXaGF0J3MgbmV3PC9wPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlc2NyaXB0aW9ucyBvZiB0aGUgZm9sbG93aW5nIG5ldyBmZWF0dXJlcyBhbmQgc2lnbmlmaWNhbnQgY2hhbmdlcyBtYWRlIHRvIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBmb3IgUmVsZWFzZSAyLjI6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAxLmh0bSNDSkFDRURERSI+SlBBIExpYnJhcnkgTWFuYWdlbWVudDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAyLmh0bSNDSkFESUZISiI+TmV3IEdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAzLmh0bSNDSkFCSUpFQyI+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA0Lmh0bSNDSkFDSkJEQSI+RWNsaXBzZUxpbmsgMS4xIFN1cHBvcnQ8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0ZDEwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIExpYnJhcnkgTWFuYWdlbWVudDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSBCdWlsZCAwMDQiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA5LTA1LTAxVDg6MTI6NTRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIExpYnJhcnkgTWFuYWdlbWVudCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUNFRERFIiBuYW1lPSJDSkFDRURERSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIExpYnJhcnkgTWFuYWdlbWVudDwvaDE+Ci08cD5Vc2UgdGhlIG5ldyA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIGNyZWF0ZSBhbmQgbWFuYWdlIEpQQSBsaWJyYXJpZXMgd2hlbiBjcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdC4gWW91IGNhbiBzcGVjaWZ5IGEgSlBBIGxpYnJhcnkgY29uZmlndXJhdGlvbiBmcm9tIGEgc2VsZWN0ZWQgSlBBIGltcGxlbWVudGF0aW9uLCBvciBjcmVhdGUgYSBjdXN0b20gbGlicmFyeS48L3A+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlIHRoZSBsaWJyYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGNsYXNzZXMgYXJlIGF2YWlsYWJsZSBmb3IgYSBnaXZlbiBwbGF0Zm9ybS48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRhZWIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMDUtMDFUODoxMjo1NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBRElGSEoiIG5hbWU9IkNKQURJRkhKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5OZXcgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgbmV3IDxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT4gdG8gY3JlYXRlIEpQQSBlbnRpdGllcyBmcm9tIHlvdXIgZGF0YWJhc2UgdGFibGVzLjwvcD4KLTxwPlRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgZW50aXRpZXMsIHRoZSB0YWJsZSBhc3NvY2lhdGlvbnMsIGFuZCBkZWZhdWx0IGVudGl0eSBwcm9wZXJ0aWVzLiBZb3UgY2FuIHRoZW4gY3VzdG9taXplIGVhY2ggaW5kaXZpZHVhbCBlbnRpdHkgYmVpbmcgZ2VuZXJhdGVkLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2ExODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4yIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFCSUpFQyIgbmFtZT0iQ0pBQklKRUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L2gxPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIG5vdyB1c2VzIHRoZSBFY2xpcHNlIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmU8L3NwYW4+IG1lbnUgdG8gY29udmVydCBleGlzdGluZyBKYXZhIHByb2plY3RzIHRvIEpQQSBwcm9qZWN0cy48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj4iQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0MjczYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RWNsaXBzZUxpbmsgMS4xIFN1cHBvcnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVjbGlwc2VMaW5rIDEuMSBTdXBwb3J0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMiIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBQ0pCREEiIG5hbWU9IkNKQUNKQkRBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FY2xpcHNlTGluayAxLjEgU3VwcG9ydDwvaDE+Ci08cD5SZWxlYXNlIDIuMiBwcm92aWRlcyBzdXBwb3J0IG9mIHRoZSBmb2xsb3dpbmcgRWNsaXBzZUxpbmsgMS4xIGZlYXR1cmVzLjwvcD4KLTx1bD4KLTxsaT4KLTxwPkVjbGlwc2VMaW5rIFhNTCBtYXBwaW5nIGZpbGUgYW5kIGl0cyBjb25maWd1cmF0aW9uIG9wdGlvbnM8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lLXRvLU1hbnkgbWFwcGluZyA8c3BhbiBjbGFzcz0iaXRhbGljIj53aXRob3V0PC9zcGFuPiBhIGpvaW4gdGFibGUuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5FY2xpcHNlTGluayAodGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCkgaXMgYSBjb21wbGV0ZSBwZXJzaXN0ZW5jZSBmcmFtZSB3b3JrLiBSZWZlciB0byA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay88L2E+PC9jb2RlPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDksJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2NhNDg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYWJsZS1wZXItQ29uY3JldGUtQ2xhc3MgSW5oZXJpdGFuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0wNS0wMVQ4OjEyOjU0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjIiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjg2IiBuYW1lPSJzdGhyZWYyODYiPjwvYT4KLTxoMT5UYWJsZS1wZXItQ29uY3JldGUtQ2xhc3MgSW5oZXJpdGFuY2U8L2gxPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIG5vdyBzdXBwb3J0cyB0aGUgSlBBIDEuMC1vcHRpb25hbCB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2Ugb3B0aW9uLiBUaGlzIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIHJlcXVpcmVkIGluIEpQQSAyLjAuPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjlhN2M2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjMjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwYzhjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OGI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBlMzZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U0NTUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M2MGQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAwY2U4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9wZXJzaXN0ZW5jZS5qYXIiIHNvdXJjZXBhdGg9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbnNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2MzExZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDFiYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBBcHIgMzAgMTc6MjQ6NDEgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM4MDBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYi9wZXJzaXN0ZW5jZS5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnBlcnNpc3RlbmNlLAotIGphdmF4LnBlcnNpc3RlbmNlLnNwaSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdiY2UzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBsaWIvcGVyc2lzdGVuY2UuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9saWIvcGVyc2lzdGVuY2UuamFyIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWIyMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2VmMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAtIERETCBHZW5lcmF0aW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYxYmZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvZGRsZ2VuL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci0KLS8qKiAKLSAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIEVjbGlwc2VMaW5rIDxjb2RlPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jb2RlPiwgCi0gKiBhbmQgZXhlY3V0ZXMgdGhlIERETCBnZW5lcmF0b3Igd2l0aCB0aGUgY29tbWFuZCBzZXQgaW4gdGhlIHByb3BlcnRpZXM6IAotICogICAgIDxjb2RlPmVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uLm91dHB1dC1tb2RlPC9jb2RlPiAKLSAqICAgICA8Y29kZT5lY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbjwvY29kZT4KLSAqIAotICogQ3VycmVudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzOgotICogICAgIFstcHUgcHVOYW1lXSAtIHBlcnNpc3RlbmNlIHVuaXQgbmFtZQotICogICAgIFstcCBwcm9wZXJ0aWVzRmlsZVBhdGhdIC0gcHJvcGVydGllcyBmb3IgRWNsaXBzZUxpbmsgRW50aXR5TWFuYWdlcgotICogIAotICogIEV4YW1wbGUgb2YgYSBwcm9wZXJ0aWVzIGZpbGU6Ci0gKiAgCWVjbGlwc2VsaW5rLmpkYmMuYmluZC1wYXJhbWV0ZXJzPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMuZHJpdmVyPW9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlcgotICogIAllY2xpcHNlbGluay5qZGJjLnVybD1qZGJjXDpkZXJieVw6Y1w6L2RlcmJ5ZGIvdGVzdGRiO2NyZWF0ZVw9dHJ1ZQotICogIAllY2xpcHNlbGluay5qZGJjLnVzZXI9dHJhbgotICogIAllY2xpcHNlbGluay5qZGJjLnBhc3N3b3JkPQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLmxldmVsPUZJTkVTVAotICogIAllY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcD1mYWxzZQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLnRocmVhZD1mYWxzZQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb249ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5leGNlcHRpb25zPXRydWUKLSAqICAJZWNsaXBzZWxpbmsub3JtLnRocm93LmV4Y2VwdGlvbnM9dHJ1ZQotICogIAllY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZT1kYXRhYmFzZQotICogIAllY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbj1kcm9wLWFuZC1jcmVhdGUtdGFibGVzCi0gKiAgCWVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uPWNcOi9fUHJvamVjdHNfL0V4YW1wbGVEREwKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcm90ZWN0ZWQgRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBlY2xpcHNlTGlua1Byb3BlcnRpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRERMRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJvcERETEZpbGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIGFwcExvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmVtZiA9IFBlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KHRoaXMuZ2V0UFVOYW1lKGFyZ3MpLCB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyk7Ci0JCXRoaXMucGVyZm9ybSgpOwotCQl0aGlzLmNsb3NlRW50aXR5TWFuYWdlckZhY3RvcnkoKTsKLQkJCi0JCXRoaXMuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm0oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBFTSB0byBnZW5lcmF0ZSBzY2hlbWEuCi0JCXRoaXMuZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKS5jbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZUVudGl0eU1hbmFnZXJGYWN0b3J5KCkgewotCQl0aGlzLmVtZi5jbG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotCi0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aChhcmdzKTsKLQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXModGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLQkJCi0JCXRoaXMuY3JlYXRlRERMRmlsZU5hbWUgPSB0aGlzLmdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoIAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FLCAKLQkJCQkJCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLCAgCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSk7Ci0KLQkJdGhpcy5kcm9wRERMRmlsZU5hbWUgPSB0aGlzLmdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLCAKLQkJCQkJCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLCAgCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUUpOyAKLQkJCi0JCXRoaXMuYXBwTG9jYXRpb24gPSB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcy5nZXQoCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKCkgewotCi0JCWlmKCAhIHRoaXMuaXNEZWJ1Z01vZGUpIHsKLQkJCW5ldyBGaWxlKHRoaXMuYXBwTG9jYXRpb24gKyAiLyIgKyB0aGlzLmNyZWF0ZURETEZpbGVOYW1lKS5kZWxldGUoKTsKLQkJCW5ldyBGaWxlKHRoaXMuYXBwTG9jYXRpb24gKyAiLyIgKyB0aGlzLmRyb3BERExGaWxlTmFtZSkuZGVsZXRlKCk7Ci0JCQluZXcgRmlsZSh0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpLmRlbGV0ZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKSB7Ci0JCQotCQlTZXQ8RW50cnk8T2JqZWN0LCBPYmplY3Q+PiBwcm9wZXJ0aWVzU2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3BlcnRpZXNTZXQgPSB0aGlzLmxvYWRFY2xpcHNlTGlua1Byb3BlcnRpZXMoZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNaXNzaW5nOiAiICsgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCwgZSk7Ci0JCX0KLQkJCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlmb3IoRW50cnk8T2JqZWN0LCBPYmplY3Q+IHByb3BlcnR5IDogcHJvcGVydGllc1NldCkgewotCQkJcHJvcGVydGllcy5wdXQoKFN0cmluZylwcm9wZXJ0eS5nZXRLZXkoKSwgKFN0cmluZylwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLSAgICBwcml2YXRlIFNldDxFbnRyeTxPYmplY3QsIE9iamVjdD4+IGxvYWRFY2xpcHNlTGlua1Byb3BlcnRpZXMoU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZW50cnlTZXQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFyZ3VtZW50IHF1ZXJpZXMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgU3RyaW5nIGdldFBVTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXB1IiwgYXJncyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wIiwgYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1kZWJ1ZyIsIGFyZ3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFZhbHVlKFN0cmluZyBhcmd1bWVudCwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmd1bWVudCkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJcmV0dXJuIGFyZ3Nbal07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJndW1lbnRFeGlzdHMoU3RyaW5nIGFyZ3VtZW50LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ3VtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiogdXRpbGl0eSBtZXRob2RzICoqKioqKioKLQkKLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgcHJvdmlkZWQgbWFwIGZvciBhbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhhdCBvYmplY3QgaXMgbm90IGF2YWlsYWJsZSwgY2hlY2sgdGhlCi0gICAgICogU3lzdGVtIHByb3BlcnRpZXMuICBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIGZyb20gZWl0aGVyIGxvY2F0aW9uLCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IAotICAgICAqIEBwYXJhbSBtYXAgCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAKLSAgICAgKiBAcmV0dXJuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyhTdHJpbmcgcHJvcGVydHlLZXksIE1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzLCBTdHJpbmcgZGVmYXVsdFZhbHVlKXsKLSAgICAJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKHByb3BlcnR5S2V5LCBvdmVycmlkZXMpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyhTdHJpbmcgcHJvcGVydHlLZXksIE1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzKXsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKG92ZXJyaWRlcyAhPSBudWxsKXsKLSAgICAgICAgICAgIHZhbHVlID0gKFN0cmluZylvdmVycmlkZXMuZ2V0KHByb3BlcnR5S2V5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyNTc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkNTA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTVmZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjA3IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWQ1MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjI4OjU0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI4Y2QwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmdlbgotQnVuZGxlLVZlcnNpb246IDEuMy4xMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnM7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKLSBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZztidW5kbGUtdmVyc2lvbj0iMi4xLjAiLAotIG9yZy5hcGFjaGUub3JvO2J1bmRsZS12ZXJzaW9uPSIyLjAuOCIsCi0gb3JnLmFwYWNoZS52ZWxvY2l0eTtidW5kbGUtdmVyc2lvbj0iMS41LjAiLAotIG9yZy5qZG9tO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViNjAyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGUwNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMmQ4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVudGl0eSBHZW4KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3Byb3BlcnR5X2ZpbGVzL2pwdF9nZW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQyNGMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVBhY2thZ2VHZW5lcmF0b3JfdGFza05hbWU9R2VuZXJhdGUgRW50aXRpZXMKLUdlblNjb3BlX3Rhc2tOYW1lPUJ1aWxkIERhdGFiYXNlIE1vZGVsCi1FbnRpdHlHZW5lcmF0b3JfdGFza05hbWU9R2VuZXJhdGUgRW50aXR5OiB7MH0KLUVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXMgPSBFcnJvciBHZW5lcmF0aW5nIEVudGl0aWVzCi0KLVRlbXBsYXRlc19ub3RGb3VuZCA9IFVuYWJsZSB0byBmaW5kIEpQQSBlbnRpdGllcyBnZW5lcmF0aW9uIHRlbXBsYXRlcyBpbiBwbHVnaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNWE1YTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBPUk0gYXNzb2NpYXRpb24uCi0gKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGFzc29jaWF0aW9uczoKLSAqIDx1bD48bGk+c2ltcGxlIGFzc29jaWF0aW9uOiBBbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBkYXRhYmFzZSB0YWJsZXMuCi0gKiBUaGUgPGVtPnJlZmVycmVyPC9jb2RlPiB0YWJsZSBpcyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGZvcmVpZ24ga2V5Ci0gKiAsIHRoZSA8ZW0+cmVmZXJlbmNlZDwvY29kZT4gdGFibGUgaXMgdGhlIG90aGVyIHBhcnR5Ljxicj4KLSAqIAotICogPGxpPm1hbnkgdG8gbWFueSBhc3NvY2lhdGlvbjogQW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gdGFibGVzIGpvaW5lZCBieSAKLSAqIGEgPGVtPmpvaW4gdGFibGU8L2VtPi4KLSAqIEluIHRoZSBleGFtcGxlIEFVVEhPUiwgQk9PSywgQVVUSE9SX0JPT0ssIFRoZSByZWZlcnJlciBhbmQgcmVmZXJlbmNlZCBhcmUgCi0gKiBBVVRIT1IgYW5kICBCT09LLCBhbmQgdGhlIGpvaW4gdGFibGUgaXMgQVVUSE9SX0JPT0suCi0gKiA8L3VsPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fT05FID0gIm1hbnktdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX01BTlkgPSAibWFueS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fT05FID0gIm9uZS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19NQU5ZID0gIm9uZS10by1tYW55IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSV9ESSA9ICJiaS1kaSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMX0RJID0gIm5vcm1hbC1kaSI7IC8vcmVmZXJyZXItPnJlZmVyZW5jZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFBPU0lURV9ESSA9ICJvcHBvc2l0ZS1kaSI7IC8vcmVmZXJlbmNlZC0+cmVmZXJyZXIKLQkKLQlwcml2YXRlIHRyYW5zaWVudCBPUk1HZW5DdXN0b21pemVyIG1DdXN0b21pemVyOwotCXByaXZhdGUgU3RyaW5nIG1SZWZlcnJlclRhYmxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBtUmVmZXJlbmNlZFRhYmxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBtSm9pblRhYmxlTmFtZTsKLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcnJlckNvbE5hbWVzOyAvKlN0cmluZyBvYmplY3RzKi8KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJlbmNlZENvbE5hbWVzOyAvKlN0cmluZyBvYmplY3RzKi8KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJyZXJKb2luQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzOyAvKlN0cmluZyBvYmplY3RzKi8KLQotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJyZXJDb2xzOyAvKk9STUdlbkNvbHVtbiBvYmplY3RzKi8KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PE9STUdlbkNvbHVtbj4gbVJlZmVyZW5jZWRDb2xzOyAvKk9STUdlbkNvbHVtbiBvYmplY3RzKi8KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PE9STUdlbkNvbHVtbj4gbVJlZmVycmVySm9pbkNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJlbmNlZEpvaW5Db2xzOyAvKk9STUdlbkNvbHVtbiBvYmplY3RzKi8KLQkKLQlwcml2YXRlIFN0cmluZyBtQ2FyZGluYWxpdHk7Ci0JcHJpdmF0ZSBTdHJpbmcgbURpcmVjdGlvbmFsaXR5OwotCXByaXZhdGUgYnl0ZSBtRmxhZ3MgPSBHRU5FUkFURUQ7Ci0JCi0JcHJpdmF0ZSBBc3NvY2lhdGlvblJvbGUgbVJlZmVycmVyUm9sZTsKLQlwcml2YXRlIEFzc29jaWF0aW9uUm9sZSBtUmVmZXJlbmNlZFJvbGU7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBGb3JlaWduS2V5IG1Gb3JlaWduS2V5OwkKLQkKLQkvKmNvbnN0YW50cyBmb3IgbUZsYWdzKi8KLQkvKndoZXRoZXIgdGhlIGFzc29jaWF0aW9uIHNob3VsZCBiZSBnZW5lcmF0ZWQqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgR0VORVJBVEVEID0gMSA8PCAwOwotCS8qd2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgY3VzdG9tIChpLmUgaXMgbm90IGF1dG8gY29tcHV0ZWQgZnJvbSBmb3JlaWduIGtleXMgcmVsYXRpb25zaGlwcykuKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIENVU1RPTSA9IDEgPDwgMTsKLQkKLQkvKioKLQkgKiBUaGUgc2ltcGxlIGFzc29jaWF0aW9uIGNvbnN0cnVjdG9yLgotCSAqIFRoZSAyIHRhYmxlcyBhcmUgam9pbmVkIHdoZW4gdGhlIHZhbHVlcyBvZiBlYWNoIGNvbHVtbiBpbgotCSAqIHJlZmVycmVyQ29sTmFtZXMgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHJlZmVyZW5jZWRDb2xOYW1lcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJyZXJUYWJsZU5hbWUgVGhlICJmb3JlaWduIGtleSIgdGFibGUuCi0JICogQHBhcmFtIHJlZmVycmVyQ29sTmFtZXMgVGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgcmVmZXJyZXIgdGFibGUuCi0JICogQHBhcmFtIHJlZmVyZW5jZWRUYWJsZU5hbWUgVGhlICJwcmltYXJ5IGtleSIgdGFibGUuCi0JICogQHBhcmFtIHJlZmVyZW5jZWRDb2xOYW1lcyBUaGUgY29sdW1uIG5hbWVzIGluIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbihPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIFN0cmluZyByZWZlcnJlclRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVycmVyQ29sTmFtZXMKLQkJCSwgU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUsIExpc3Q8U3RyaW5nPiByZWZlcmVuY2VkQ29sTmFtZXMpICB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCW1SZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVycmVyVGFibGVOYW1lOwotCQltUmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JCW1SZWZlcnJlckNvbE5hbWVzID0gcmVmZXJyZXJDb2xOYW1lczsKLQkJbVJlZmVyZW5jZWRDb2xOYW1lcyA9IHJlZmVyZW5jZWRDb2xOYW1lczsKLQkJCi0JCW1DYXJkaW5hbGl0eSA9IE1BTllfVE9fT05FOwotCQltRGlyZWN0aW9uYWxpdHkgPSBCSV9ESTsKLQkJCi0JCXNldEN1c3RvbSh0cnVlKTsKLQl9Ci0JLyoqCi0JICogVGhlIG1hbnkgdG8gbWFueSBjb25zdHJ1Y3Rvci4KLQkgKiBUaGUgMiB0YWJsZXMgYXJlIGpvaW5lZCB3aGVuIHRoZSB2YWx1ZXMgb2YgZWFjaCBjb2x1bW4gaW4KLQkgKiByZWZlcnJlckNvbE5hbWVzIG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiByZWZlcnJlckpvaW5Db2xOYW1lcwotCSAqICwgYW5kIGVhY2ggY29sdW1uIGluIHJlZmVyZW5jZWRDb2xOYW1lcyBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcy4KLQkgKgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbihPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIFN0cmluZyByZWZlcnJlclRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVycmVyQ29sTmFtZXMKLQkJCSwgU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUsIExpc3Q8U3RyaW5nPiByZWZlcmVuY2VkQ29sTmFtZXMKLQkJCSwgU3RyaW5nIGpvaW5UYWJsZU5hbWUsIExpc3Q8U3RyaW5nPiByZWZlcnJlckpvaW5Db2xOYW1lcywgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRKb2luQ29sTmFtZXMpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1DdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJbVJlZmVycmVyVGFibGVOYW1lID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0JCW1SZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZTsKLQkJbVJlZmVycmVyQ29sTmFtZXMgPSByZWZlcnJlckNvbE5hbWVzOwotCQltUmVmZXJlbmNlZENvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOwotCQltSm9pblRhYmxlTmFtZSA9IGpvaW5UYWJsZU5hbWU7Ci0JCW1SZWZlcnJlckpvaW5Db2xOYW1lcyA9IHJlZmVycmVySm9pbkNvbE5hbWVzOwotCQltUmVmZXJlbmNlZEpvaW5Db2xOYW1lcyA9IHJlZmVyZW5jZWRKb2luQ29sTmFtZXM7Ci0JCQotCQltQ2FyZGluYWxpdHkgPSBNQU5ZX1RPX01BTlk7CQotCQltRGlyZWN0aW9uYWxpdHkgPSBCSV9ESTsKLQkJCi0JCXNldEN1c3RvbSh0cnVlKTsKLQl9Ci0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IgbmVlZGVkIGJ5IHRoZSBkZXNlcmlhbGl6YXRpb24gKHNob3VsZCBub3QgYmUgdXNlZCBvdGhlcndpc2UpLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbigpIHsKLQl9Ci0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGNhcmRpbmFsaXR5IGJhc2Vkb24gdGhlIGZvcmlnbiBrZXkgZGVmaW5pdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgY29tcHV0ZUNhcmRpbmFsaXR5KCkgIHsKLQkJLypieSBkZWZhdWx0IHRoZSBhc3NvY2lhdGlvbiBpcyBtYW55LXRvLW9uZSB1bmxlc3MgdGhlIGZvcmVpZ24ga2V5IAotCQkgKiBpcyBhbHNvIHRoZSBwcmltYXJ5IGtleSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIG9uZS10by1vbmUuKi8KLQkJbUNhcmRpbmFsaXR5ID0gTUFOWV9UT19PTkU7Ci0JCQotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVmZXJyZXJDb2xzID0gZ2V0UmVmZXJyZXJDb2x1bW5zKCk7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBwa0NvbHMgPSBnZXRSZWZlcnJlclRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKLQkJaWYgKHBrQ29scy5zaXplKCkgPT0gcmVmZXJyZXJDb2xzLnNpemUoKSkgewotCQkJYm9vbGVhbiBpc0ZrUGsgPSB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDAsIG4gPSBwa0NvbHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQkJaWYgKCEoKE9STUdlbkNvbHVtbilwa0NvbHMuZ2V0KGkpKS5nZXROYW1lKCkuZXF1YWxzKCgoT1JNR2VuQ29sdW1uKXJlZmVycmVyQ29scy5nZXQoaSkpLmdldE5hbWUoKSkpIHsKLQkJCQkJaXNGa1BrID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpc0ZrUGspIHsKLQkJCQltQ2FyZGluYWxpdHkgPSBPTkVfVE9fT05FOwotCQkJfQotCQl9Ci0JCQotCQlzZXRDdXN0b20oZmFsc2UpOwotCX0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGFzc2NvY2lhdGlvbnMgYXJlIGRlc2VyaWFsaXplZCB0byBhdHRhY2ggCi0JICogdGhlIGN1c3RvbWl6ZXIgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmUoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSB7Ci0JCW1DdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJCi0JCWlmIChtUmVmZXJyZXJSb2xlICE9IG51bGwpIHsKLQkJCW1SZWZlcnJlclJvbGUucmVzdG9yZSh0aGlzKTsKLQkJfQotCQlpZiAobVJlZmVyZW5jZWRSb2xlICE9IG51bGwpIHsKLQkJCW1SZWZlcmVuY2VkUm9sZS5yZXN0b3JlKHRoaXMpOwotCQl9Ci0JfQotCXB1YmxpYyBPUk1HZW5UYWJsZSBnZXRSZWZlcnJlclRhYmxlKCkgIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyLmdldFRhYmxlKG1SZWZlcnJlclRhYmxlTmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBtUmVmZXJyZXJUYWJsZU5hbWU7Ci0JfQotCXB1YmxpYyBPUk1HZW5UYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKSAgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXIuZ2V0VGFibGUobVJlZmVyZW5jZWRUYWJsZU5hbWUpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBtUmVmZXJlbmNlZFRhYmxlTmFtZTsKLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldEpvaW5UYWJsZSgpICB7Ci0JCXJldHVybiBtQ3VzdG9taXplci5nZXRUYWJsZShtSm9pblRhYmxlTmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0Sm9pblRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1Kb2luVGFibGVOYW1lOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgZm9yIHRoZSByZWZlcnJlcgotCSAqIGNvbHVtbnMuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcnJlckNvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJyZXJDb2xzID09IG51bGwpIHsKLQkJCU9STUdlblRhYmxlIHJlZmVycmVyVGFibGUgPSBnZXRSZWZlcnJlclRhYmxlKCk7Ci0JCQltUmVmZXJyZXJDb2xzID0gcmVmZXJyZXJUYWJsZS5nZXRDb2x1bW5zQnlOYW1lcyhtUmVmZXJyZXJDb2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlckNvbHM7Ci0JfQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG1SZWZlcnJlckNvbE5hbWVzOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgZm9yIHRoZSByZWZlcmVuY2VkCi0JICogY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCkgewotCQlpZiAobVJlZmVyZW5jZWRDb2xzID09IG51bGwpIHsKLQkJCW1SZWZlcmVuY2VkQ29scyA9IGdldFJlZmVyZW5jZWRUYWJsZSgpLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcmVuY2VkQ29sTmFtZXMpOwotCQl9Ci0JCXJldHVybiBtUmVmZXJlbmNlZENvbHM7Ci0JfQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVyZW5jZWRDb2xOYW1lczsKLQl9Ci0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcnJlckpvaW5Db2x1bW5zKCkgewotCQlpZiAobVJlZmVycmVySm9pbkNvbHMgPT0gbnVsbCkgewotCQkJbVJlZmVycmVySm9pbkNvbHMgPSBnZXRKb2luVGFibGUoKS5nZXRDb2x1bW5zQnlOYW1lcyhtUmVmZXJyZXJKb2luQ29sTmFtZXMpOwotCQl9Ci0JCXJldHVybiBtUmVmZXJyZXJKb2luQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG1SZWZlcnJlckpvaW5Db2xOYW1lczsKLQl9Ci0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKSAgewotCQlpZiAobVJlZmVyZW5jZWRKb2luQ29scyA9PSBudWxsKSB7Ci0JCQltUmVmZXJlbmNlZEpvaW5Db2xzID0gZ2V0Sm9pblRhYmxlKCkuZ2V0Q29sdW1uc0J5TmFtZXMobVJlZmVyZW5jZWRKb2luQ29sTmFtZXMpOwotCQl9Ci0JCXJldHVybiBtUmVmZXJlbmNlZEpvaW5Db2xzOwotCX0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBtUmVmZXJlbmNlZEpvaW5Db2xOYW1lczsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gY2FyZGluYWxpdHksIG9uZSBvZiB7QGxpbmsgI01BTllfVE9fT05FfXx7QGxpbmsgI01BTllfVE9fTUFOWX0KLQkgKiB8e0BsaW5rICNPTkVfVE9fT05FfXx7QGxpbmsgI09ORV9UT19NQU5ZfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKSB7Ci0JCXJldHVybiBtQ2FyZGluYWxpdHk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENhcmRpbmFsaXR5KFN0cmluZyBjYXJkaW5hbGl0eSkgewotCQlhc3NlcnQoY2FyZGluYWxpdHkuZXF1YWxzKE1BTllfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoTUFOWV9UT19NQU5ZKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoT05FX1RPX09ORSkgfHwgY2FyZGluYWxpdHkuZXF1YWxzKE9ORV9UT19NQU5ZKSk7Ci0JCW1DYXJkaW5hbGl0eSA9IGNhcmRpbmFsaXR5OwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBkaXJlY3Rpb25hbGl0eSwgb25lIG9mIHtAbGluayAjQklfREl9fHtAbGluayAjTk9STUFMX0RJfQotCSAqIHx7QGxpbmsgI09QUE9TSVRFX0RJfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uYWxpdHkoKSB7Ci0JCXJldHVybiBtRGlyZWN0aW9uYWxpdHk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbmFsaXR5KFN0cmluZyBkaXIpIHsKLQkJYXNzZXJ0KGRpci5lcXVhbHMoQklfREkpIHx8IGRpci5lcXVhbHMoTk9STUFMX0RJKSB8fCBkaXIuZXF1YWxzKE9QUE9TSVRFX0RJKSk7Ci0JCWlmICghZGlyLmVxdWFscyhtRGlyZWN0aW9uYWxpdHkpKSB7Ci0JCQltRGlyZWN0aW9uYWxpdHkgPSBkaXI7Ci0JCQkKLQkJCWlmIChkaXIuZXF1YWxzKE5PUk1BTF9ESSkpIHsKLQkJCQltUmVmZXJlbmNlZFJvbGUgPSBudWxsOwotCQkJfSBlbHNlIGlmIChkaXIuZXF1YWxzKE9QUE9TSVRFX0RJKSkgewotCQkJCW1SZWZlcnJlclJvbGUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBhc3NvY2lhdGlvbiBpcyBiaWRpcmVjdGlvbmFsLgotCSAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgPGNvZGU+Z2V0RGlyZWN0aW9uYWxpdHkoKS5lcXVhbHMoQklfREkpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JpZGlyZWN0aW9uYWwoKSB7Ci0JCXJldHVybiBtRGlyZWN0aW9uYWxpdHkuZXF1YWxzKEJJX0RJKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoaXMgYXNzb2NpYXRpb24gc2hvdWxkIGJlIGdlbmVyYXRlZC4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWQoKSB7Ci0JCXJldHVybiAobUZsYWdzICYgR0VORVJBVEVEKSAhPSAwOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWQoYm9vbGVhbiBnZW5lcmF0ZWQpIHsKLQkJaWYgKGdlbmVyYXRlZCAhPSBpc0dlbmVyYXRlZCgpKSB7Ci0JCQlpZiAoZ2VuZXJhdGVkKSB7Ci0JCQkJbUZsYWdzIHw9IEdFTkVSQVRFRDsKLQkJCX0gZWxzZSB7Ci0JCQkJbUZsYWdzICY9IH5HRU5FUkFURUQ7Ci0JCQl9Ci0JCQltUmVmZXJyZXJSb2xlID0gbVJlZmVyZW5jZWRSb2xlID0gbnVsbDsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhpcyBhc3NvY2lhdGlvbiBpcyBjdXN0b20gKGkuZSBpcyBub3QgYXV0byBjb21wdXRlZCBmcm9tIGZvcmVpZ24ga2V5cyByZWxhdGlvbnNoaXBzKS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDdXN0b20oKSB7Ci0JCXJldHVybiAobUZsYWdzICYgQ1VTVE9NKSAhPSAwOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b20oYm9vbGVhbiBjdXN0b20pIHsKLQkJaWYgKGN1c3RvbSkgewotCQkJbUZsYWdzIHw9IENVU1RPTTsKLQkJfSBlbHNlIHsKLQkJCW1GbGFncyAmPSB+Q1VTVE9NOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIHJvbGUgZm9yIHRoZSByZWZlcnJlciBzaWRlLCBvciBudWxsIAotCSAqIGlmIG5vbmUgKGkuZSBpZiB0aGUgZGlyZWN0aW9uYWxpdHkgZG9lcyBub3QgaW5jbHVkZSBpdCkuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uUm9sZSBnZXRSZWZlcnJlclJvbGUoKSB7Ci0JCWlmIChtUmVmZXJyZXJSb2xlID09IG51bGwgJiYgaXNHZW5lcmF0ZWQoKSkgewotCQkJaWYgKCFnZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhPUFBPU0lURV9ESSkpIHsgLy9CSV9ESSBvciBOT1JNQUxfREkKLQkJCQltUmVmZXJyZXJSb2xlID0gbmV3IEFzc29jaWF0aW9uUm9sZSh0aGlzLCB0cnVlLyppc1JlZmVycmVyRW5kKi8pOwotCQkJfQotCQl9Ci0JCXJldHVybiBtUmVmZXJyZXJSb2xlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiByb2xlIGZvciB0aGUgcmVmZXJlbmNlZCBzaWRlLCBvciBudWxsIAotCSAqIGlmIG5vbmUgKGkuZSBpZiB0aGUgZGlyZWN0aW9uYWxpdHkgZG9lcyBub3QgaW5jbHVkZSBpdCkuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uUm9sZSBnZXRSZWZlcmVuY2VkUm9sZSgpIHsKLQkJaWYgKG1SZWZlcmVuY2VkUm9sZSA9PSBudWxsICYmIGlzR2VuZXJhdGVkKCkpIHsKLQkJCWlmICghZ2V0RGlyZWN0aW9uYWxpdHkoKS5lcXVhbHMoQXNzb2NpYXRpb24uTk9STUFMX0RJKSkgeyAvL0JJX0RJIG9yIE9QUE9TSVRFX0RJCi0JCQkJbVJlZmVyZW5jZWRSb2xlID0gbmV3IEFzc29jaWF0aW9uUm9sZSh0aGlzLCBmYWxzZS8qaXNSZWZlcnJlckVuZCovKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbVJlZmVyZW5jZWRSb2xlOwotCX0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoaXMgYXNzb2NpYXRpb24gaXMgdmFsaWQgKHZhbGlkIHRhYmxlIGFuZCBjb2x1bW4gbmFtZXMpLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoKXsKLQkJaWYgKCFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1SZWZlcnJlclRhYmxlTmFtZSwgbVJlZmVycmVyQ29sTmFtZXMpCi0JCQkJfHwgIWlzVmFsaWRUYWJsZUFuZENvbHVtbnMobVJlZmVyZW5jZWRUYWJsZU5hbWUsIG1SZWZlcmVuY2VkQ29sTmFtZXMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1Kb2luVGFibGVOYW1lICE9IG51bGwpIHsKLQkJCWlmICghaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhtSm9pblRhYmxlTmFtZSwgbVJlZmVycmVySm9pbkNvbE5hbWVzKQotCQkJCQl8fCAhaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhtSm9pblRhYmxlTmFtZSwgbVJlZmVyZW5jZWRKb2luQ29sTmFtZXMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhTdHJpbmcgdGFibGVOYW1lLCBMaXN0PFN0cmluZz4gY29sdW1uTmFtZXMpIHsKLQkJT1JNR2VuVGFibGUgdGFibGUgPSBtQ3VzdG9taXplci5nZXRUYWJsZSh0YWJsZU5hbWUpOwotCQlpZiAodGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1uTmFtZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpY29sdW1uTmFtZXMuZ2V0KGkpOwotCQkJaWYgKHRhYmxlLmdldENvbHVtbkJ5TmFtZShjb2xOYW1lKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGb3JlaWduS2V5KEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQl0aGlzLm1Gb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJCi0JfQotCXB1YmxpYyBGb3JlaWduS2V5IGdldEZvcmVpZ25LZXkoKXsKLQkJcmV0dXJuIHRoaXMubUZvcmVpZ25LZXk7Ci0JfTsJCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYoIHRoaXMgPT0gb2JqICkKLQkJCXJldHVybiB0cnVlOwotCQlpZiggb2JqIGluc3RhbmNlb2YgQXNzb2NpYXRpb24gKXsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uMiA9IChBc3NvY2lhdGlvbilvYmo7Ci0JCQlpZiAoIXRoaXMuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyVGFibGVOYW1lKCkpCi0JCQkJCXx8ICF0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSkKLQkJCQkJfHwgIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHRoaXMuZ2V0Sm9pblRhYmxlTmFtZSgpLCBhc3NvY2lhdGlvbjIuZ2V0Sm9pblRhYmxlTmFtZSgpKQotCQkJCQl8fCAhdGhpcy5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkpCi0JCQkJCXx8ICF0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkpCi0JCQkJCSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCQkJCQotCQkJLyp0aGUgMiBhc3NvY2lhdGlvbiBoYXZlIHRoZSBzYW1lIHJlZmVycmVyLCByZWZlcmVuY2VkIGFuZCBqb2luIHRhYmxlKi8KLQkJCS8vSWYgTVRPIG9yIE9UTSBhc3NvY2lhdGlvbgotCQkJaWYgKHRoaXMuZ2V0Sm9pblRhYmxlTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICh0aGlzLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpKQotCQkJCQkmJiB0aGlzLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCXJldHVybiBtUmVmZXJyZXJUYWJsZU5hbWUgKyAiICIgKyBtQ2FyZGluYWxpdHkgKyAiICIgKyBtUmVmZXJlbmNlZFRhYmxlTmFtZSA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvblJvbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjU0ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvblJvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiByb2xlICh0aGUgcmVmZXJyZXIgb3IgcmVmZXJlbmNlZCByb2xlKS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25Sb2xlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIHRyYW5zaWVudCBBc3NvY2lhdGlvbiBtQXNzb2NpYXRpb247IC8vdHJhbnNpZW50OiBzZWUgcmVzdG9yZQotCXByaXZhdGUgYm9vbGVhbiBtSXNSZWZlcnJlclJvbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBtQ2FzY2FkZTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCQkKLQlBc3NvY2lhdGlvblJvbGUoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24sIGJvb2xlYW4gaXNSZWZlcnJlclJvbGUpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Bc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uOwotCQltSXNSZWZlcnJlclJvbGUgPSBpc1JlZmVycmVyUm9sZTsKLQl9Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IgbmVlZGVkIGJ5IHRoZSBkZXNlcmlhbGl6YXRpb24gKHNob3VsZCBub3QgYmUgdXNlZCBvdGhlcndpc2UpLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvblJvbGUoKSB7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgYXNzY29jaWF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIHRvIGF0dGFjaCAKLQkgKiB0aGUgY3VzdG9taXplciBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZShBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQltQXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQl9Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uIGdldEFzc29jaWF0aW9uKCkgewotCQlyZXR1cm4gbUFzc29jaWF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVycmVyUm9sZSgpIHsKLQkJcmV0dXJuIG1Jc1JlZmVycmVyUm9sZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3Bwb3NpdGUgcm9sZSBvciBudWxsIGlmIHRoZSBhc3NvY2lhdGlvbiAKLQkgKiBpcyBub3QgYmkgZGlyZWN0aW9uYWwuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uUm9sZSBnZXRPcHBvc2l0ZVJvbGUoKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gZ2V0QXNzb2NpYXRpb24oKTsKLQkJaWYgKCFhc3NvY2lhdGlvbi5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5CSV9ESSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChpc1JlZmVycmVyUm9sZSgpKSB7Ci0JCQlyZXR1cm4gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBjYXJkaW5hbGl0eSwgb25lIG9mIHtAbGluayAjTUFOWV9UT19PTkV9fHtAbGluayAjTUFOWV9UT19NQU5ZfQotCSAqIHx7QGxpbmsgI09ORV9UT19PTkV9fHtAbGluayAjT05FX1RPX01BTll9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXJkaW5hbGl0eSgpIHsKLQkJU3RyaW5nIHR5cGUgPSBtQXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKTsKLQkJaWYgKCFtSXNSZWZlcnJlclJvbGUpIHsKLQkJCWlmICh0eXBlLmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWSkpIHsKLQkJCQl0eXBlID0gQXNzb2NpYXRpb24uTUFOWV9UT19PTkU7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fT05FKSkgewotCQkJCXR5cGUgPSBBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVycmVyVGFibGUoKSB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVyQ29sdW1ucygpewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWZlcnJlciBjb2x1bW4uCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRSZWZlcmVuY2VkQ29sdW1uKFN0cmluZyByZWZlcnJlckNvbHVtbikgIHsKLQkJYm9vbGVhbiBoYXNKb2luVGFibGUgPSBtQXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlKCkgIT0gbnVsbDsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlZmVycmVyQ29sdW1ucyA9IGdldFJlZmVycmVyQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IHJlZmVycmVyQ29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSByZWZlcnJlckNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKHJlZmVycmVyQ29sdW1uKSkgewotCQkJCWlmIChoYXNKb2luVGFibGUpIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVycmVySm9pbkNvbHVtbnMoKS5nZXQoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnQoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJyZXIgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWZlcmVuY2VkIGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldFJlZmVycmVyQ29sdW1uKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uKSAgewotCQlib29sZWFuIGhhc0pvaW5UYWJsZSA9IG1Bc3NvY2lhdGlvbi5nZXRKb2luVGFibGUoKSAhPSBudWxsOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVmZXJlbmNlZENvbHVtbnMgPSBnZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IHJlZmVyZW5jZWRDb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IHJlZmVyZW5jZWRDb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uZ2V0TmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uKSkgewotCQkJCWlmIChoYXNKb2luVGFibGUpIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpLmdldChpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZ2V0UmVmZXJyZXJDb2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnQoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpICB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCkgIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVySm9pbkNvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbnMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3IgZm9yIAotCSAqIHRoZSBwcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcm9sZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpICAgewotCQlpZiAobVByb3BlcnR5TmFtZSAhPSBudWxsKSB7IC8vaWYgdGhlIHVzZXIgZXhwbGljaXRseSBzZXQgaXQgdGhlbiBkb24ndCBiZSB0b28gc21hcnQKLQkJCXJldHVybiBtUHJvcGVydHlOYW1lOwotCQl9Ci0JCXJldHVybiBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCk7Ci0JfQotCQkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgcHJvcE5hbWUgPSAiIjsKLQkJT1JNR2VuVGFibGUgcmVmZXJyZXJUYWJsZSA9IGdldFJlZmVycmVyVGFibGUoKTsKLQkJT1JNR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0KLQkJYm9vbGVhbiBpc1Npbmd1bGFyID0gaXNTaW5ndWxhcigpOwotCQlwcm9wTmFtZSA9IHJlZmVyZW5jZWRUYWJsZS5nZXRWYXJOYW1lKGlzU2luZ3VsYXIpOwotCQkKLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IGNsYXNoaW5nUm9sZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvblJvbGU+KCk7IC8vcm9sZXMgd2l0aCBvdXIgc2FtZSByZWZlcnJlciBhbmQgcmVmZXJlbmNlZCB0YWJsZXMgKGkuZSB3b3VsZCB5aWVsZCB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lIGluIHRoZSBzYW1lIGJlYW4pCi0JCS8qbWFrZSBzdXJlIHRoZXJlIGlzIG5vIHJvbGUgd2l0aCB0aGUgc2FtZSBuYW1lLiovCi0JCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb25Sb2xlPiBpdGVyID0gcmVmZXJyZXJUYWJsZS5nZXRBc3NvY2lhdGlvblJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyb2xlLmdldFJlZmVycmVyVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKHJlZmVycmVyVGFibGUuZ2V0TmFtZSgpKQotCQkJCQkmJiByb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKSkKLQkJCQkJJiYgcm9sZS5pc1Npbmd1bGFyKCkgPT0gaXNTaW5ndWxhcikgewotCQkJCWNsYXNoaW5nUm9sZXMuYWRkKHJvbGUpOwotCQkJfQotCQl9Ci0JCWlmIChjbGFzaGluZ1JvbGVzLnNpemUoKSA+IDEpIHsKLQkJCWludCBpbmRleCA9IGNsYXNoaW5nUm9sZXMuaW5kZXhPZih0aGlzKTsKLQkJCWFzc2VydChpbmRleCA+PSAwKTsKLQkJCXByb3BOYW1lICs9IGluZGV4KzE7Ci0JCX0KLQkJCi0JCS8qbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUuKi8KLQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSByZWZlcnJlclRhYmxlLmdldENvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29sdW1uLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhwcm9wTmFtZSkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gaXNTaW5ndWxhciA/ICJCZWFuIiA6ICJTZXQiOwotCQkJCXByb3BOYW1lICs9IHByZWZpeDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb3BOYW1lOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTaW5ndWxhcigpIHsKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gZ2V0Q2FyZGluYWxpdHkoKTsKLQkJcmV0dXJuIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpOwotCX0KLQkKLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRvciBmb3IgCi0JICogdGhlIHByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByb2xlLgotCSAqIElmIHRoZSBhcmd1bWVudCBuYW1lIGlzIG51bGwgb3IgZW1wdHkgc3RyaW5nIHRoZW4gdGhlIAotCSAqIGRlZmF1bHQgY29tcHV0ZWQgbmFtZSBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQkJbVByb3BlcnR5TmFtZSA9IG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2NhZGUgdmFsdWUgZm9yIHRoaXMgcm9sZSwgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIG1DYXNjYWRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKFN0cmluZyBjYXNjYWRlKSB7Ci0JCWlmIChjYXNjYWRlICE9IG51bGwgJiYgY2FzY2FkZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQljYXNjYWRlID0gbnVsbDsKLQkJfQotCQltQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgdXNlZCBpbiBhIGNvbW1lbnQgaW4gdGhlIGdlbmVyYXRlZCAKLQkgKiBmaWxlIChmcm9tIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpICB7Ci0JCS8vPCEtLSAkZGlyZWN0aW9uYWxpdHkgJGNhcmRpbmFsaXR5IGFzc29jaWF0aW9uIHRvICRyZWZlcmVuY2VkQ2xhc3NOYW1lIC0tPgotCQlTdHJpbmcgZGlyZWN0aW9uYWxpdHk7Ci0JCWlmIChnZXRBc3NvY2lhdGlvbigpLmdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKEFzc29jaWF0aW9uLkJJX0RJKSkgewotCQkJZGlyZWN0aW9uYWxpdHkgPSAiYmktZGlyZWN0aW9uYWwiOwotCQl9IGVsc2UgewotCQkJZGlyZWN0aW9uYWxpdHkgPSAidW5pLWRpcmVjdGlvbmFsIjsKLQkJfQotCQlyZXR1cm4gZGlyZWN0aW9uYWxpdHkgKyAiICIgKyBnZXRBc3NvY2lhdGlvbigpLmdldENhcmRpbmFsaXR5KCkgKyAiIGFzc29jaWF0aW9uIHRvICIgKyBnZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRDbGFzc05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Jhc2VFbnRpdHlHZW5DdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0Jhc2VFbnRpdHlHZW5DdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTMxZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9CYXNlRW50aXR5R2VuQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIE9STUdlbkN1c3RvbWl6ZXIgYWNjb3JkaW5nIHRvIEpQQSBzcGVjaWZpY2F0aW9uIGZvcgotICogZW50aXR5IGdlbmVyYXRpb24uCi0gKiAKLSAqIFRoaXMgaXMgdXNlZCB0byByZXRyaWV2ZS9jaGFuZ2UgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgd2l6YXJkIGFuZCBpcyBhbHNvCi0gKiBwYXNzZWQgYXMgYSBjb250ZXh0IG9iamVjdCB0byBWZWxvY2l0eS4KLSAqLwotcHVibGljIGNsYXNzIEJhc2VFbnRpdHlHZW5DdXN0b21pemVyIGV4dGVuZHMgT1JNR2VuQ3VzdG9taXplcgotCWltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCi0JLyogbWFwcGluZyBraW5kcyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19NQVBQSU5HX0tJTkQgPSAiYmFzaWMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01BUFBJTkdfS0lORCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9NQVBQSU5HX0tJTkQgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogdGhlIHN0cmluZ3MgZm9yIGdlbmVyYXRvciBuYW1lcy4gVGhlc2UgYXBwZWFyIGluIGEgY29tYm8gYm94IGFuZCB1c2VkIGJ5Ci0JICogdGhlIFZlbG9jaXR5IHRlbXBsYXRlIHByb2Nlc3NpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fR0VORVJBVE9SID0gImF1dG8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkVfR0VORVJBVE9SID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0dFTkVSQVRPUiA9ICJpZGVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SID0gInNlcXVlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9HRU5FUkFUT1IgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChGaWxlIGZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJc3VwZXIuaW5pdChmaWxlLCBzY2hlbWEpOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gLS0tLS0tIE9STUdlbkN1c3RvbWl6ZXIgbWV0aG9kcwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbGxJZEdlbmVyYXRvcnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxTdHJpbmc+KDUpOwotCQkvKiBhZGQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd291bGQgYXBwZWFyIGluIHRoZSBjb21ibyAqLwotCQlyZXN1bHQuYWRkKEFVVE9fR0VORVJBVE9SKTsKLQkJcmVzdWx0LmFkZChJREVOVElUWV9HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKFNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoVEFCTEVfR0VORVJBVE9SKTsKLQkJcmVzdWx0LmFkZChOT05FX0dFTkVSQVRPUik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROb0lkR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gTk9ORV9HRU5FUkFUT1I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGl0eUlkR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gSURFTlRJVFlfR0VORVJBVE9SOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTZXF1ZW5jZUlkR2VuZXJhdG9ycygpIHsKLQkJU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5IYXNoU2V0PFN0cmluZz4oMyk7Ci0JCXJlc3VsdC5hZGQoU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gRFRQVXRpbC5nZXRKYXZhVHlwZShjb2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxQcm9wZXJ0eVR5cGVzKCkgewotCQkvKgotCQkgKiBKYXZhIHByaW1pdGl2ZSB0eXBlcywgd3JhcHBlciBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzICwKLQkJICogamF2YS5sYW5nLlN0cmluZywgamF2YS5tYXRoLkJpZ0ludGVnZXIsIGphdmEubWF0aC5CaWdEZWNpbWFsLAotCQkgKiBqYXZhLnV0aWwuRGF0ZSwgamF2YS51dGlsLkNhbGVuZGFyLCBqYXZhLnNxbC5EYXRlLCBqYXZhLnNxbC5UaW1lLAotCQkgKiBqYXZhLnNxbC5UaW1lc3RhbXAsIGJ5dGVbXSwgQnl0ZVtdLCBjaGFyW10sIENoYXJhY3RlcltdLCBlbnVtcywgYW5kCi0JCSAqIGFueSBvdGhlciB0eXBlIHRoYXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUuCi0JCSAqLwotCQkvLyByZXR1cm4gaW4gdGhlIG9yZGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjb21ibwotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCSJib29sZWFuIiwKLQkJCSJCb29sZWFuIiwKLQkJCSJieXRlIiwKLQkJCSJCeXRlIiwKLQkJCSJieXRlW10iLAotCQkJImNoYXIiLAotCQkJImNoYXJbXSIsCi0JCQkiQ2hhcmFjdGVyIiwKLQkJCSJDaGFyYWN0ZXJbXSIsCi0JCQkiZG91YmxlIiwKLQkJCSJEb3VibGUiLAotCQkJImZsb2F0IiwKLQkJCSJGbG9hdCIsCi0JCQkiaW50IiwKLQkJCSJJbnRlZ2VyIiwKLQkJCSJsb25nIiwKLQkJCSJMb25nIiwKLQkJCSJPYmplY3QiLAotCQkJInNob3J0IiwKLQkJCSJTaG9ydCIsCi0JCQkiU3RyaW5nIiwKLQkJCWphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEudXRpbC5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnV0aWwuRGF0ZS5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnNxbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEuc3FsLlRpbWUuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLmdldE5hbWUoKQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBbGxNYXBwaW5nS2luZHMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJQkFTSUNfTUFQUElOR19LSU5ELCBJRF9NQVBQSU5HX0tJTkQsIFZFUlNJT05fTUFQUElOR19LSU5ECi0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRCYXNpY01hcHBpbmdLaW5kKCkgewotCQlyZXR1cm4gQkFTSUNfTUFQUElOR19LSU5EOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRNYXBwaW5nS2luZCgpIHsKLQkJcmV0dXJuIElEX01BUFBJTkdfS0lORDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlZGl0Q2FzY2FkZShBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFueVNpZGVJc0Fzc29jaWF0aW9uT3duZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gLS0tLSBWZWxvY2l0eSB0ZW1wbGF0ZXMgbWV0aG9kcwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FzY2FkZXMgYW5ub3RhdGlvbiBtZW1iZXIgdmFsdWUsIG9yIGVtcHR5IHN0cmluZyBpZiBub25lLgotCSAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIG51bGwgYmVjYXVzZSBWZWxvY2l0eSBkb2VzIG5vdCBsaWtlCi0JICogbnVsbCB3aGVuIHVzZWQgaW4gI3NldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbkNhc2NhZGVzKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjYXNjYWRlcyA9IFN0cmluZ1V0aWwuc3RyVG9MaXN0KHJvbGUuZ2V0Q2FzY2FkZSgpLCAnLCcsIHRydWUvKiB0cmltICovKTsKLQkJaWYgKGNhc2NhZGVzID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoICd7JyApOwotCQlmb3IgKGludCBpID0gMCwgbiA9IGNhc2NhZGVzLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJU3RyaW5nIGNhc2NhZGUgPSBjYXNjYWRlcy5nZXQoaSk7Ci0JCQlTdHJpbmcgZW51bVN0cjsKLQkJCWlmIChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5BTExfQ0FTQ0FERSkpIHsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLkFMTCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLlBFUlNJU1RfQ0FTQ0FERSkpIHsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLlBFUlNJU1QiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5NRVJHRV9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuTUVSR0UiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5SRU1PVkVfQ0FTQ0FERSkpIHsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFzc2VydCAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuUkVGUkVTSF9DQVNDQURFKSk7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5SRUZSRVNIIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGkgIT0gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZW51bVN0cik7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmV0Y2ggdHlwZSBhbm5vdGF0aW9uIG1lbWJlciB2YWx1ZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmUuCi0JICogRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluc3RlYWQgb2YgbnVsbCBiZWNhdXNlIFZlbG9jaXR5IGRvZXMgbm90IGxpa2UKLQkgKiBudWxsIHdoZW4gdXNlZCBpbiAjc2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2VuRmV0Y2goT1JNR2VuVGFibGUgdGFibGUpIHsKLQkJU3RyaW5nIGZldGNoID0gdGFibGUuZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCWlmIChmZXRjaCA9PSBudWxsIHx8IE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0guZXF1YWxzKGZldGNoKSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoZmV0Y2guZXF1YWxzKE9STUdlblRhYmxlLkxBWllfRkVUQ0gpKSB7Ci0JCQlyZXR1cm4gIkZldGNoVHlwZS5MQVpZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICJGZXRjaFR5cGUuRUFHRVIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0RhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0RhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTQyNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0KLS8qKgotICogUHJvdmlkZSBhIHBsdWdnYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5kIGhvdyB0aGUgZW50aXR5IGdlbmVyYXRvcgotICogcHJpbnRzIHRoZSBuYW1lcyBvZiB2YXJpb3VzIGRhdGFiYXNlIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgewotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZW50aXR5IGFuZCB0aGUgdGFibGUgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBlbnRpdHkncwotCSAqIFRhYmxlIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGVudGl0eQotCSAqIG1hcHMgdG8gdGhlIHRhYmxlIGJ5IGRlZmF1bHQuCi0JICovCi0JU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgYW5kIHRoZSBjb2x1bW4KLQkgKiB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSdzCi0JICogQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqLwotCVN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUKLQkgKiBtYW55LXRvLW9uZSBvciBtYW55LXRvLW1hbnkgZm9yZWlnbiBrZXkgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIEpvaW5Db2x1bW4gYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgYXR0cmlidXRlCi0JICogbWFwcyB0byB0aGUgam9pbiBjb2x1bW4gYnkgZGVmYXVsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGZvcmVpZ24ga2V5IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNvbHVtbiBwYWlyIHdob3NlCi0JICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgb2YgdGhlIGZvcmVpZ24KLQkgKiBrZXkncyByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCVN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgSm9pbkNvbHVtbgotCSAqIGFubm90YXRpb24ncyAnbmFtZScgb3IgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50LgotCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW9uZSBhbmQgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4KLQkgKiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBuYW1lIGFuZC9vciByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFyZS9pcwotCSAqIG5vdCBhcHBsaWNhYmxlLgotCSAqIEBzZWUgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nLCBGb3JlaWduS2V5KQotCSAqLwotCVN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShDb2x1bW4gY29sdW1uKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgSm9pblRhYmxlCi0JICogYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LgotCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW1hbnkgbWFwcGluZ3Mgd2hlbiB0aGUgZGVmYXVsdAotCSAqIGpvaW4gdGFibGUgbmFtZSBpcyBub3QgYXBwbGljYWJsZS4KLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSk7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBsZSByZXR1cm5zIHRoZSBkYXRhYmFzZSBvYmplY3QncyBuYW1lLAotCSAqIHVuYWx0ZXJlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIGNvbHVtbi5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQlyZXR1cm4gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRhYmxlLmdldE5hbWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuRGVmYXVsdCI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvSnB0R2VuTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvSnB0R2VuTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyY2U2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgZW50aXR5IGdlbmVyYXRpb24uCi0gKi8KLWNsYXNzIEpwdEdlbk1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VHZW5lcmF0b3JfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuU2NvcGVfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbXBsYXRlc19ub3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9HZW5lcmF0aW5nX0VudGl0aWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9nZW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0R2VuTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRHZW5NZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlblBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9KcHRHZW5QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0MGMyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0pwdEdlblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEpwdEdlblBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5nZW4iOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24gKCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSApIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlJTG9nIGxvZyA9IFBsYXRmb3JtLmdldExvZyhidW5kbGUpOwotCQlsb2cubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBtc2csIGUgKSk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbiggQ29yZUV4Y2VwdGlvbiBjZSApIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlJTG9nIGxvZyA9IFBsYXRmb3JtLmdldExvZyhidW5kbGUpOwotCQlsb2cubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBjZSkpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2FlMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PUk1HZW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZC5FbnRpdHlHZW5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIE9STSBnZW5lcmF0aW9uIHByb3BlcnRpZXMgZm9yIGEgZGF0YWJhc2UgCi0gKiBjb2x1bW4uCi0gKiAKLSAqIDxwPlRoaXMgaXMgZGVzaWduZWQgdG8gYmUgY3JlYXRlZC9jaGFuZ2VkIGJ5IHRoZSBnZW5lcmF0aW9uIHdpemFyZCwKLSAqIGFuZCBnZW5lcmF0ZWQgdXNpbmcgVmVsb2NpdHkgdGVtcGxhdGVzLgotICogVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlIHBlcnNpc3RlZC9yZXRyaWV2ZWQgdXNpbmcgCi0gKiA8Y29kZT5PUk1HZW5DdXN0b21pemVyPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT1JNR2VuQ29sdW1uCi17Ci0JcHJpdmF0ZSBUYWJsZSBtVGFibGU7Ci0JcHJpdmF0ZSBDb2x1bW4gbURiQ29sdW1uOwotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIE9STUdlblRhYmxlIG1HZW5UYWJsZTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQV9MQU5HX1BBQ0tBR0UgPSAiamF2YS5sYW5nLiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgT1JNR2VuQ29sdW1uKENvbHVtbiBkYkNvbHVtbiwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltRGJDb2x1bW4gPSBkYkNvbHVtbjsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltVGFibGUgPSBkYkNvbHVtbi5nZXRUYWJsZSgpOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEdlblRhYmxlKE9STUdlblRhYmxlIG9ybUdlblRhYmxlKSB7Ci0JCW1HZW5UYWJsZSA9IG9ybUdlblRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZWQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHkocHJvcE5hbWUsIG1UYWJsZS5nZXROYW1lKCksIGdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJZ2V0Q3VzdG9taXplcigpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lLCBib29sZWFuIHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoZGVmYXVsdFZhbHVlID09IHZhbHVlKSB7Ci0JCQlzZXRDdXN0b21pemVkKHByb3BOYW1lLCBudWxsKTsgLy9yZW1vdmUgdGhlIHByb3BlcnR5Ci0JCX0gZWxzZSB7Ci0JCQlnZXRDdXN0b21pemVyKCkuc2V0Qm9vbGVhblByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUobURiQ29sdW1uLmdldE5hbWUoKSwgbURiQ29sdW1uKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYkNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uTmFtZSgpewotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQlidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShtRGJDb2x1bW4pOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCA/IGFubm90YXRpb25OYW1lIDogbURiQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbiBnZXREYkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgYmVhbiBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gY29sdW1uLgotCSAqIERvZXMgbm90IHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCS8vbmFtZSA9IFN0cmluZ1V0aWwuY29sdW1uTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQkJbmFtZSA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhuYW1lLCBnZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfTkFNRSwgbmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKXsKLQkJcmV0dXJuIGlzRGVmYXVsdG5hbWUoKSAmJiBpc1VwZGF0ZWFibGUoKSAmJiBpc0luc2VydGFibGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlcyBvZiBuYW1lIGVsZW1lbnQgaW4gdGhlIEBDb2x1bW4gaXMgZGVmYXVsdAotCSAqIHNvIHdlIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRuYW1lKCl7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZSgpOwotLy8JCVN0cmluZyBkYkNvbHVtbk5hbWUgPSBnZXROYW1lKCk7Ci0vLwkJcmV0dXJuIHByb3BOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIGRiQ29sdW1uTmFtZSApOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuCi0JCQlidWlsZENvbHVtbkFubm90YXRpb25OYW1lKHByb3BOYW1lLCB0aGlzLm1EYkNvbHVtbiApOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU9PW51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIHR5cGUuCi0JICogRG9lcyBub3QgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVR5cGUoKSAgewotCQlTdHJpbmcgdHlwZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfVFlQRSk7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbiggdGhpcy5tRGJDb2x1bW4gKTsKLQkJfQotCQlpZiggdHlwZS5zdGFydHNXaXRoKEpBVkFfTEFOR19QQUNLQUdFKSApIHsKLQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyggSkFWQV9MQU5HX1BBQ0tBR0UubGVuZ3RoKCkgKTsKLQkJfQotCQlpZiggdHlwZS5lcXVhbHMoImphdmEuc3FsLkRhdGUiKSl7Ci0JCQl0eXBlID0gImphdmEudXRpbC5EYXRlIjsKLQkJfQotCQkJCi0JCXJldHVybiB0eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZVByb3BlcnR5VHlwZSgpICB7Ci0JCXJldHVybiBtR2VuVGFibGUuZ2V0U2ltcGxpZmllZENvbFR5cGUoIGdldFByb3BlcnR5VHlwZSgpICk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVR5cGUoU3RyaW5nIHR5cGUpICB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHModHlwZSwgZ2V0UHJvcGVydHlUeXBlKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX1RZUEUsIHR5cGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sdW1uIHR5cGUgaXMgbnVtZXJpYy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc051bWVyaWMoKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdGhpcy5tRGJDb2x1bW4uaXNOdW1lcmljKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcga2luZCwgb25lIG9mIHtAbGluayAjUFJPUEVSVFlfTUFQUElOR19LSU5EfXx7QGxpbmsgI0lEX01BUFBJTkdfS0lORH0KLQkgKiB8e0BsaW5rICNWRVJTSU9OX01BUFBJTkdfS0lORH18e0BsaW5rICNUSU1FU1RBTVBfTUFQUElOR19LSU5EfS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gbnVsbCAoZGVmYXVsdHMgdG8gYmFzaWMgcHJvcGVydHkgdHlwZSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2luZCgpIHsKLQkJU3RyaW5nIGtpbmQgPSBjdXN0b21pemVkKE1BUFBJTkdfS0lORCk7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWtpbmQgPSBnZXRDdXN0b21pemVyKCkuZ2V0QmFzaWNNYXBwaW5nS2luZCgpOwotCQkJCi0JCQlpZiAoIHRoaXMubURiQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpIAotCQkJCSAmJiB0aGlzLm1EYkNvbHVtbi5nZXRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID09IDEpIHsKLQkJCQlraW5kID0gZ2V0Q3VzdG9taXplcigpLmdldElkTWFwcGluZ0tpbmQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4ga2luZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0tpbmQoU3RyaW5nIG1hcHBpbmdLaW5kKSAgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKG1hcHBpbmdLaW5kLCBnZXRNYXBwaW5nS2luZCgpKSkgewotCQkJc2V0Q3VzdG9taXplZChNQVBQSU5HX0tJTkQsIG1hcHBpbmdLaW5kKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNOdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKCB0aGlzLm1EYkNvbHVtbi5pc051bWVyaWMoKSl7Ci0JCQlyZXR1cm4gbURiQ29sdW1uLmdldFByZWNpc2lvbigpOwotCQl9Ci0JCXJldHVybiBtRGJDb2x1bW4uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWNpbWFsRGlnaXRzKCkgewotCQlpZiAoIHRoaXMubURiQ29sdW1uLmlzTnVtZXJpYygpICl7Ci0JCQlyZXR1cm4gbURiQ29sdW1uLmdldFNjYWxlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgJiYKLQkJCQl0aGlzLm1UYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKFBST1BFUlRZX0RFU0MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlTE9CKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNMT0IoKTsKLQl9CQotCi0JcHVibGljIGJvb2xlYW4gaXNOZWVkTWFwVGVtcG9yYWxUeXBlKCkgewotCQlTdHJpbmcgcHJvcGVydHlUeXBlID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJcmV0dXJuICggcHJvcGVydHlUeXBlLmVxdWFscygiamF2YS51dGlsLkRhdGUiKSB8fCBwcm9wZXJ0eVR5cGUuZXF1YWxzKCJqYXZhLnV0aWwuQ2FsZW5kYXIiKSApOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRlbXBvcmFsVHlwZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHRUeXBlID0gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oIHRoaXMubURiQ29sdW1uICk7Ci0JCWlmKCBkZWZhdWx0VHlwZS5lcXVhbHMoImphdmEuc3FsLkRhdGUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiREFURSI7IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2UgaWYoIGRlZmF1bHRUeXBlLmVxdWFscygiamF2YS5zcWwuVGltZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICJUSU1FIjsgLy8kTk9OLU5MUy0xJAotCQl9ZWxzZSB7Ci0JCQlyZXR1cm4gIlRJTUVTVEFNUCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIHByb3BlcnR5IGdldHRlciBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXx7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0KLQkgKiB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHB1YmxpYykuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUdldFNjb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKFBST1BFUlRZX0dFVF9TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBVQkxJQ19TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5R2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoc2NvcGUsIGdldFByb3BlcnR5R2V0U2NvcGUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfR0VUX1NDT1BFLCBzY29wZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIHByb3BlcnR5IHNldHRlciBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXx7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0KLQkgKiB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHB1YmxpYykuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVNldFNjb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKFBST1BFUlRZX1NFVF9TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBVQkxJQ19TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5U2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoc2NvcGUsIGdldFByb3BlcnR5U2V0U2NvcGUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfU0VUX1NDT1BFLCBzY29wZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGZpZWxkIG1lbWJlciBzY29wZSwgb25lIG9mIHtAbGluayAjUFVCTElDX1NDT1BFfXx7QGxpbmsgI1BST1RFQ1RFRF9TQ09QRX0KLQkgKiB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4KLQkgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHByaXZhdGUpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChGSUVMRF9TQ09QRSk7Ci0JCWlmIChzY29wZSA9PSBudWxsKSB7Ci0JCQlzY29wZSA9IFBSSVZBVEVfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb2x1bW4gc2hvdWxkIGJlIHVzZWQgaW4gdGhlIAotCSAqIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlSW5FcXVhbHMoKSAgewotCQlyZXR1cm4gY3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX0VRVUFMUykgfHwgaXNQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUluRXF1YWxzKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX0VRVUFMUywgdmFsdWUsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29sdW1uIHNob3VsZCBiZSB1c2VkIGluIHRoZSAKLQkgKiA8Y29kZT50b1N0cmluZzwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlSW5Ub1N0cmluZygpICB7Ci0JCXJldHVybiBjdXN0b21pemVkQm9vbGVhbihVU0VfSU5fVE9fU1RSSU5HKSB8fCBpc1ByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlSW5Ub1N0cmluZyhib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9UT19TVFJJTkcsIHZhbHVlLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlYWJsZSgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhjdXN0b21pemVkKFVQREFURUFCTEUpKTsgLy9kZWZhdWx0cyB0byB0cnVlIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlYWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKFVQREFURUFCTEUsIHZhbHVlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gISJmYWxzZSIuZXF1YWxzKGN1c3RvbWl6ZWQoSU5TRVJUQUJMRSkpOyAvL2RlZmF1bHRzIHRvIHRydWUgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oSU5TRVJUQUJMRSwgdmFsdWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhjdXN0b21pemVkKEdFTkVSQVRFRCkpOyAvL2RlZmF1bHRzIHRvIHRydWUgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihHRU5FUkFURUQsIHZhbHVlLCB0cnVlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJuYW1lPSIgKyBnZXROYW1lKCkgKyAiOyB0eXBlPSIgKyBnZXRQcm9wZXJ0eVR5cGUoKSA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQl9Ci0KLQkvKmdldC9zZXQgYW5kIGZpZWxkIHNjb3BlcyovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX1NDT1BFID0gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURURfU0NPUEUgPSAicHJvdGVjdGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSVZBVEVfU0NPUEUgPSAicHJpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qY3VzdG9taXphdGlvbiBwcm9wZXJ0aWVzKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJwcm9wZXJ0eU5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVFlQRSA9ICJwcm9wZXJ0eVR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19LSU5EID0gIm1hcHBpbmdLaW5kIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVNDID0gInByb3BlcnR5RGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfR0VUX1NDT1BFID0gInByb3BlcnR5R2V0U2NvcGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NFVF9TQ09QRSA9ICJwcm9wZXJ0eVNldFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9TQ09QRSA9ICJmaWVsZFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5fRVFVQUxTID0gInVzZUluRXF1YWxzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5fVE9fU1RSSU5HID0gInVzZUluVG9TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURUFCTEUgPSAidXBkYXRlYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUQUJMRSA9ICJpbnNlcnRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURUQgPSAiZ2VuUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlbkN1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI2OTRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkZvcmVpZ25LZXlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5TdHJpbmdVdGlsOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgZGF0YWJhc2Ugc2NoZW1hIHRvIE9STSBlbnRpdHkgCi0gKiBnZW5lcmF0aW9uLgotICogCi0gKiA8cD5UaGUgY3VzdG9taXphdGlvbiBzZXR0aW5ncyBhcmUgbWFpbmx5IGV4cG9zZWQgaW4gdGhlIGZvcm0gb2YgCi0gKiBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgbm8gYXNzdW1wdGlvbnMgaW4gdGhpcyBjbGFzcyBhYm91dCB0aGUgbWVhbmluZyBvZiB0aGUgCi0gKiBwcm9wZXJ0eSBuYW1lcy4gUHJvcGVydGllcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBzcGVjaWZpYyB0YWJsZXMgYW5kIHRhYmxlIAotICogY29sdW1ucywgb3IgZ2xvYmFsbHkgZm9yIGFueSB0YWJsZSBhbmQvb3IgY29sdW1uLgotICogCi0gKiA8cD5TdWJjbGFzcyBjYW4gaW1wbGVtZW50IHRoZSBzZXRzIG9mIGFic3RyYWN0IG1ldGhvZHMgdG8gcHJvdmlkZSBPUk0gdmVuZG9yCi0gKiBzcGVjaWZpYyBwcm9wZXJ0aWVzLgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPUk1HZW5DdXN0b21pemVyIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCi0JLyoqCi0JICogQSB2YWx1ZSBwYXNzZWQgZm9yIHRoZSB0YWJsZSBuYW1lIGFyZ3VtZW50IHRvIGdldC9zZXRQcm9wZXJ0eSAKLQkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIGFwcGxpZXMgdG8gYW55IHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9UQUJMRSA9ICJfX2FueVRhYmxlX18iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0RETF9BTk5PVEFUSU9OID0gImdlbmVyYXRlRERMQW5ub3RhdGlvbnMiOwotCS8qdGhlIHN0cmluZyB1c2VkIGluIHRoZSBwcm9wZXJ0eSBuYW1lIGluIG1Qcm9wcyB0byBpbmRpY2F0ZSAKLQkgKiBhIG51bGwgdGFibGUgdmFsdWUuKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9UQUJMRSA9ICIiOwotCS8qdGhlIHN0cmluZyB1c2VkIGluIHRoZSBwcm9wZXJ0eSBuYW1lIGluIG1Qcm9wcyB0byBpbmRpY2F0ZSAKLQkgKiBhIG51bGwgY29sdW1uIHZhbHVlLiovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfQ09MVU1OID0gIiI7Ci0JCi0JLypUaGlzIHZlcnNpb24gbnVtYmVyIGlzIHdyaXR0ZW4gaW4gdGhlIGhlYWRlciBvZiB0aGUgY3VzdG9taXphdGlvbiBzdHJlYW0KLQkgKiBhbmQgcmVhZCBhdCBkZS1zZXJpYWxpemF0aW9uIHRpbWUsIGlmIGl0IGlzIGRpZmZlcmVudCB0aGVuIHRoZSBmaWxlIGlzIGludmFsaWRhdGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1ZFUlNJT04gPSAyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfQ09ORklHX0ZJTEUgPSAidXBkYXRlQ29uZmlnRmlsZSI7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBTY2hlbWEgbVNjaGVtYTsKLQlwcml2YXRlIHRyYW5zaWVudCBGaWxlIG1GaWxlOwotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1UYWJsZU5hbWVzOwotCS8qa2V5OiB0YWJsZSBuYW1lLCB2YWx1ZTogT1JNR2VuVGFibGUgb2JqZWN0LiovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFN0cmluZyAsIE9STUdlblRhYmxlPiBtVGFibGVzOwotCS8qdGhlIDxjb2RlPkFzc29jaWF0aW9uPC9jb2RlPiBvYmplY3RzIHNvcnRlZCBieSB0aGVpciAiZnJvbSIgCi0JICogdGFibGUgbmFtZS4gSW5jbHVkZXMgYWxsIGFzc29jaWF0aW9uIGRlcml2ZWQgZnJvbSBmb3JlaWduIGtleXMgCi0JICogaW4gdXNlciBzZWxlY3RlZCB0YWJsZXMuIFNpbmNlIHNvbWUgb2YgdGhlIGZvcmVpZ24ga2V5cyBtYXkgcG9pbnQgdG8gdGFibGUKLQkgKiB1c2VyIGRvZXMgbm90IHNlbGVjdCwgdGhpcyBsaXN0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSAgbVZhbGlkQXNzb2NpYXRpb25zCi0JICovCi0JcHJpdmF0ZSBMaXN0PEFzc29jaWF0aW9uPiBtQXNzb2NpYXRpb25zOwotCS8qCi0JICogTGlzdCBvZiB2YWxpZCBhc3NvY2lhdGlvbnMgd2l0aGluIHRoZSB1c2VyIHNlbGVjdGVkIHRhYmxlcyAgCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxBc3NvY2lhdGlvbj4gbVZhbGlkQXNzb2NpYXRpb25zOwotCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbUludmFsaWRGb3JlaWduQXNzb2NpYXRpb25zOwotCQotCS8qdGhlIHByb3BlcnR5IG5hbWUgaXMgaW4gdGhlIGZvcm0gJHRhYmxlTmFtZS4kY29sdW1uTmFtZS4kcHJvcGVydHlOYW1lLgotCSAqIFdoZXJlIHRhYmxlTmFtZSBjb3VsZCBiZSBOVUxMX1RBQkxFIG9yIEFOWV9UQUJMRQotCSAqIGFuZCBjb2x1bW5OYW1lIGNvdWxkIGJlIE5VTExfQ09MVU1OKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbVByb3BzID0gbmV3IGphdmEudXRpbC5IYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPSBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5EZWZhdWx0LklOU1RBTkNFOwotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gYWJzdHJhY3QgbWV0aG9kcwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcHJpbWFyeSBrZXkgZ2VuZXJhdG9yIHNjaGVtZXMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxTdHJpbmc+IGdldEFsbElkR2VuZXJhdG9ycygpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRldmVsb3Blci1hc3NpZ25lZCBpZCBnZW5lcmF0b3IuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5vSWRHZW5lcmF0b3IoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBpZGVudGl0eSBpZCBnZW5lcmF0b3IuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkZW50aXR5SWRHZW5lcmF0b3IoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9ycy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTZXQ8U3RyaW5nPiBnZXRTZXF1ZW5jZUlkR2VuZXJhdG9ycygpOwotCS8qKgotCSAqIFJldHVybnMgYSBwcm9wZXJ0eSB0eXBlIGZyb20gdGhlIGdpdmVuIGRhdGFiYXNlIGNvbHVtbi4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbihDb2x1bW4gY29sdW1uKSA7Ci0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHN0cmluZ3MgcmVwcmVzZW50aW5nIHByb3BlcnR5IHR5cGVzLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEFsbFByb3BlcnR5VHlwZXMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgc3RyaW5ncyByZXByZXNlbnRpbmcgcHJvcGVydHkgbWFwcGluZyBraW5kcy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRBbGxNYXBwaW5nS2luZHMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNpYyAoZGVmYXVsdCkgcHJvcGVydHkgbWFwcGluZyBraW5kLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRCYXNpY01hcHBpbmdLaW5kKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgKHByaW1hcnkga2V5KSBwcm9wZXJ0eSBtYXBwaW5nIGtpbmQuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkTWFwcGluZ0tpbmQoKTsKLQkvKioKLQkgKiBJbnRlcmFjdHMgd2l0aCB0aGUgdXNlciB0byBlZGl0IHRoZSBjYXNjYWRlIG9mIHRoZSBnaXZlbiAKLQkgKiByb2xlLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBhbHNvIGNhbGwgPGNvZGU+QXNzb2NpYXRpb25Sb2xlLnNldENhc2NhZGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHVzZXIgaW50ZXJhY3Rpb24gaXMgY2FuY2VsbGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVkaXRDYXNjYWRlKEFzc29jaWF0aW9uUm9sZSByb2xlKTsKLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY3VzdG9taXphdGlvbiBzZXR0aW5ncy4KLQkgKiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSB3aGVuIHRoZSA8Y29kZT5zYXZlPC9jb2RlPiAKLQkgKiBtZXRob2QgaXMgY2FsbGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoIEZpbGUgZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQl0aGlzLm1TY2hlbWEgPSBzY2hlbWE7Ci0JCW1GaWxlID0gZmlsZTsKLQkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJc2V0UHJvcGVydHkoT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSCwgT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSCwgT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEUsIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBudWxsOwotCQlPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOwotCQl0cnkgCi0JCXsKLQkJCS8vcmVhZCBpdCBpbiBhIGZpbGUgZmlyc3QgdG8gc3BlZWR1cCBkZXNlcmlhbGl6YXRpb24KLQkJCWJ5dGVbXSBieXRlcyA9IEZpbGVVdGlsLnJlYWRGaWxlKGZpbGUpOwotCQkJaXN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JCQlvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaXN0cmVhbSk7Ci0JCQkKLQkJCUZpbGVIZWFkZXIgaGVhZGVyID0gKEZpbGVIZWFkZXIpb2lzLnJlYWRPYmplY3QoKTsKLQkJCWlmIChoZWFkZXIubVZlcnNpb24gPT0gRklMRV9WRVJTSU9OKSB7Ci0JCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gKE9STUdlbkN1c3RvbWl6ZXIpb2lzLnJlYWRPYmplY3QoKTsKLQkJCQlyZXN0b3JlKGN1c3RvbWl6ZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqT1JNR2VuQ3VzdG9taXplci5sb2FkIGZhaWxlZCAiK2ZpbGUrIjogIiArIGV4KTsJCQkJCi0JCX0KLQkJZmluYWxseSAKLQkJewotCQkJaWYgKG9pcyAhPSBudWxsKQotCQkJewotCQkJCXRyeSAKLQkJCQl7Ci0JCQkJCW9pcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChpc3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5IAotCQkJCXsKLQkJCQkJaXN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZSgpewotCQlyZXR1cm4gdGhpcy5tRmlsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBzY2hlbWEpewotCQl0aGlzLm1TY2hlbWEgPSBzY2hlbWE7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKXsKLQkJcmV0dXJuIG1TY2hlbWE7Ci0JfQotCQotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yIG5lZWRlZCBieSB0aGUgZGVzZXJpYWxpemF0aW9uLgotCSAqLwotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXN0b21pemF0aW9uIGZpbGUuCi0JICogVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCItLS1PUk1HZW5DdXN0b21pemVyLnNhdmU6ICIgKyBtRmlsZSk7Ci0JCWlmICghbUZpbGUuZXhpc3RzKCkgJiYgIW1GaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotCQlqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBudWxsOwotCQlib29sZWFuIGRlbGV0ZUl0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCWZvcyA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0obUZpbGUpOwotCQkJb29zID0gbmV3IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKGZvcyk7Ci0JCQlGaWxlSGVhZGVyIGhlYWRlciA9IG5ldyBGaWxlSGVhZGVyKCk7Ci0JCQlvb3Mud3JpdGVPYmplY3QoaGVhZGVyKTsKLQkJCW9vcy53cml0ZU9iamVjdCh0aGlzKTsKLQkJCWRlbGV0ZUl0ID0gZmFsc2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy9kZWxldGVJdCBpcyB0cnVlLCBzbyB0aGUgY2FjaGUgaXMgbm90IHNhdmVkLgotCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJIlVuYWJsZSB0byBzYXZlIHRoZSBPUk1HZW5DdXN0b21pemVyIGZpbGU6ICIrbUZpbGUsZXgpKTsKLQkJCUpwdEdlblBsdWdpbi5sb2dFeGNlcHRpb24oIGNlICk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChvb3MhPW51bGwpIG9vcy5jbG9zZSgpOwotCQkJCWlmIChmb3MhPW51bGwpIGZvcy5jbG9zZSgpOwotCQkJCWlmIChkZWxldGVJdCkgewotCQkJCQltRmlsZS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4Mikge30JCi0JCX0KLQl9Ci0JCi0JcHVibGljIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIpIHsKLQkJaWYgKGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZGF0YWJhc2UgYW5ub3RhdGlvbiBuYW1lIGJ1aWxkZXIgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyID0gZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci0JfQkKLQotCS8qKgotCSAqIFJldHVybnMge0BsaW5rICNHRU5FUkFURV9ERExfQU5OT1RBVElPTn0gIGluZGljYXRpbmcgd2hldGhlcgotCSAqIHRoZSBvcHRpb25hbCBEREwgcGFyYW1ldGVycyBsaWtlIGxlbmd0aCwgbnVsbGFibGUsIHVucWl1ZSwgZXRjIHNob3VsZCBiZSBnZW5lcmF0ZWQgCi0JICogaW4gQENvbHVtbiBhbm5vdGF0aW9uLgotCSAqIGRlZmF1bHRzIHRvIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVERExBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHMoZ2V0UHJvcGVydHkoR0VORVJBVEVfRERMX0FOTk9UQVRJT04sIEFOWV9UQUJMRSwgbnVsbCkpOyAvL2RlZmF1bHRzIHRvIGZhbHNlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHByb3BlcnR5IHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJU3RyaW5nIGtleSA9IGdldFByb3BLZXkocHJvcGVydHlOYW1lLCB0YWJsZU5hbWUsIGNvbE5hbWUpOwotCQlTdHJpbmcgdmFsdWUgPSBtUHJvcHMuZ2V0KGtleSk7Ci0JCS8qaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBhbmQgaXQgaXMgYSB0YWJsZSBwcm9wZXJ0eSB0aGVuIAotCQkgKiBnZXQgdGhlIGRlZmF1bHQgdGFibGUgcHJvcGVydHkuKi8KLQkJaWYgKHZhbHVlID09IG51bGwgJiYgdGFibGVOYW1lICE9IG51bGwgJiYgY29sTmFtZSA9PSBudWxsICYmICF0YWJsZU5hbWUuZXF1YWxzKEFOWV9UQUJMRSkpIHsKLQkJCXZhbHVlID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBBTllfVEFCTEUsIGNvbE5hbWUpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyoqCi0JICogQ2hhbmdlcyBhIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlLCBjb3VsZCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJU3RyaW5nIGtleSA9IGdldFByb3BLZXkocHJvcGVydHlOYW1lLCB0YWJsZU5hbWUsIGNvbE5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJbVByb3BzLnB1dChrZXksIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCW1Qcm9wcy5yZW1vdmUoa2V5KTsKLQkJfQotCX0KLQkvKioKLQkgKiBTYW1lIGFzIHtAbGluayAjZ2V0UHJvcGVydHkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IGJ1dCAKLQkgKiBjb252ZXJ0cyB0aGUgdmFsdWUgdG8gYm9vbGVhbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0YWJsZU5hbWUsIGNvbE5hbWUpOwotCQlyZXR1cm4gInRydWUiLmVxdWFscyh2YWx1ZSk7Ci0JfQotCS8qKgotCSAqIENoYW5nZXMgYSB0YWJsZSBib29sZWFuIHByb3BlcnR5IHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHZhbHVlLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlID8gInRydWUiIDogImZhbHNlIiwgdGFibGVOYW1lLCBjb2xOYW1lKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHRhYmxlcyB0byBnZW5lcmF0ZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiBtVGFibGVOYW1lcyAhPSBudWxsID8gbVRhYmxlTmFtZXMgOiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmV0Y2ggdHlwZSBhbm5vdGF0aW9uIG1lbWJlciB2YWx1ZSwgb3IgZW1wdHkgc3RyaW5nIAotCSAqIGlmIG5vbmUuCi0JICogRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluc3RlYWQgb2YgbnVsbCBiZWNhdXNlIFZlbG9jaXR5IGRvZXMgbm90IGxpa2UgbnVsbCAKLQkgKiB3aGVuIHVzZWQgaW4gI3NldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbkZldGNoKE9STUdlblRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiAiIjsKLQl9CQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB0YWJsZSB1c2VyIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIGluIHRoZSAKLQkgKiBnZW5lcmF0aW9uIHdpemFyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZU5hbWVzKExpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzKSB7Ci0JCW1UYWJsZU5hbWVzID0gdGFibGVOYW1lczsKLQkJbVRhYmxlcyA9IG51bGw7Ci0JCW1WYWxpZEFzc29jaWF0aW9ucyA9IG51bGw7IC8vcmVjb21wdXRlCi0JCW1JbnZhbGlkRm9yZWlnbkFzc29jaWF0aW9ucyA9IHRydWU7IC8vbWFrZSBzdXJlIGZvcmVpZ24gYXNzb2NpYXRpb25zIGZyb20gbmV3bHkgYWRkZWQgdGFibGVzIGFyZSBjb21wdXRlZC4KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFibGUgbmFtZXMgdG8gYmUgZ2VuZXJhdGVkLgotCSAqIFRoaXMgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gPGNvZGU+Z2V0VGFibGVOYW1lczwvY29kZT4gaWYgdGhlcmUgCi0JICogYXJlIG1hbnktdG8tbWFueSBqb2luIHRhYmxlcyBhbmQgYXJlIG5vdCBjb250cmlidXRpbmcgCi0JICogaW4gYW55IG90aGVyIGFzc29jaWF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEdlblRhYmxlTmFtZXMoKSAgewotCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBnZXRUYWJsZU5hbWVzKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxTdHJpbmc+KG5hbWVzLnNpemUoKSk7Ci0JCQotCQkvKmZpbHRlciBvdXQgam9pbiB0YWJsZXMqLwotCQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnMgPSBnZXRBc3NvY2lhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHRhYmxlTmFtZXNJdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsgdGFibGVOYW1lc0l0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyB0YWJsZU5hbWUgPSB0YWJsZU5hbWVzSXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yPEFzc29jaWF0aW9uPiBhc3NvY0l0ZXIgPSBhc3NvY2lhdGlvbnMuaXRlcmF0b3IoKTsgYXNzb2NJdGVyLmhhc05leHQoKTsgKSB7Ci0JCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBhc3NvY0l0ZXIubmV4dCgpOwotCQkJCWlmICghYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHRhYmxlTmFtZS5lcXVhbHMoYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSkKLQkJCQkJCXx8IHRhYmxlTmFtZS5lcXVhbHMoYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKSkgewotCQkJCQlpc1ZhbGlkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0YWJsZU5hbWUuZXF1YWxzKGFzc29jaWF0aW9uLmdldEpvaW5UYWJsZU5hbWUoKSkpIHsKLQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpc1ZhbGlkKSB7Ci0JCQkJcmVzdWx0LmFkZCh0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYW4gPGNvZGU+T1JNR2VuVGFibGU8L2NvZGU+IG9iamVjdCBnaXZlbiBpdHMgbmFtZSwgb3IgCi0JICogbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBPUk1HZW5UYWJsZSBnZXRUYWJsZShTdHJpbmcgdGFibGVOYW1lKSAgewotCQlpZiAobVRhYmxlcyA9PSBudWxsKSB7Ci0JCQltVGFibGVzID0gbmV3IGphdmEudXRpbC5IYXNoTWFwPFN0cmluZywgT1JNR2VuVGFibGU+KG1UYWJsZU5hbWVzLnNpemUoKSk7Ci0JCX0KLQkJCi0JCWlmKG1UYWJsZU5hbWVzIT1udWxsICYmIG1TY2hlbWEhPW51bGwpewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBtVGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpdGVyLm5leHQoKTsKLQkJCQlUYWJsZSBkYlRhYmxlID0gbVNjaGVtYS5nZXRUYWJsZU5hbWVkKCBuYW1lICk7Ci0JCQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgewotCQkJCQltVGFibGVzLnB1dChuYW1lLCBjcmVhdGVHZW5UYWJsZShkYlRhYmxlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtVGFibGVzLmdldCh0YWJsZU5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5Bc3NvY2lhdGlvbjwvY29kZT4gb2JqZWN0cyBzb3J0ZWQgYnkgdGhlaXIgImZyb20iIAotCSAqIHRhYmxlIG5hbWUuCi0JICovCi0JcHVibGljIExpc3Q8QXNzb2NpYXRpb24+IGdldEFzc29jaWF0aW9ucygpewotCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25zKHRydWUvKnZhbGlkT25seSovKTsKLQl9Ci0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXNzb2NpYXRpb24oQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pICB7Ci0JCWdldEFzc29jaWF0aW9ucyhmYWxzZS8qdmFsaWRPbmx5Ki8pLmFkZChhc3NvY2lhdGlvbik7Ci0JCWlmIChtVmFsaWRBc3NvY2lhdGlvbnMgIT0gbnVsbCkgewotCQkJbVZhbGlkQXNzb2NpYXRpb25zLmFkZChhc3NvY2lhdGlvbik7Ci0JCX0KLQkJCi0JfQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGdpdmVuIGFzc29jaWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFzc29jaWF0aW9uKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSAgewotCQlib29sZWFuIHJlbW92ZWQgPSBnZXRBc3NvY2lhdGlvbnMoZmFsc2UvKnZhbGlkT25seSovKS5yZW1vdmUoYXNzb2NpYXRpb24pOwotCQlhc3NlcnQocmVtb3ZlZCk7Ci0JCQotCQlpZiAobVZhbGlkQXNzb2NpYXRpb25zICE9IG51bGwpIHsKLQkJCXJlbW92ZWQgPSBtVmFsaWRBc3NvY2lhdGlvbnMucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJCWFzc2VydChyZW1vdmVkKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYW4gYXNzb2NpYXRpb24gc2ltaWxhciB0byB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24gCi0JICogYWxyZWFkeSBleGlzdHMuCi0JICogVGhpcyBpcyBkZWNpZGVkIGJhc2VkIG9ubHkgb24gdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBhbmQgY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaW1pbGFyQXNzb2NpYXRpb25FeGlzdHMoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pIHsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGl0ZXIgPSBnZXRBc3NvY2lhdGlvbnMoZmFsc2UvKnZhbGlkT25seSovKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24yID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSkKLQkJCQkJCXx8ICFhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpCi0JCQkJCQl8fCAhU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoYXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlTmFtZSgpLCBhc3NvY2lhdGlvbjIuZ2V0Sm9pblRhYmxlTmFtZSgpKQotCQkJCQkJfHwgIWFzc29jaWF0aW9uLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSkKLQkJCQkJCXx8ICFhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpKQotCQkJCQkJKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0JCQkJCQotCQkJCS8qdGhlIDIgYXNzb2NpYXRpb24gaGF2ZSB0aGUgc2FtZSByZWZlcnJlciwgcmVmZXJlbmNlZCBhbmQgam9pbiB0YWJsZSovCi0JCQkJaWYgKGFzc29jaWF0aW9uLmdldEpvaW5UYWJsZU5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkpCi0JCQkJCQkmJiBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbk5hbWVzKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPk9STUdlblRhYmxlPC9jb2RlPiBpbnN0YW5jZS4gCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlIGNyZWF0ZUdlblRhYmxlKFRhYmxlIGRiVGFibGUpIHsKLQkJcmV0dXJuIG5ldyBPUk1HZW5UYWJsZShkYlRhYmxlLCB0aGlzKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBpbnN0YW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT1JNR2VuQ29sdW1uIGNyZWF0ZUdlbkNvbHVtbihDb2x1bW4gZGJDb2wpIHsKLQkJcmV0dXJuIG5ldyBPUk1HZW5Db2x1bW4oZGJDb2wsIHRoaXMpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2Ugc3BlY3MgcmVxdWlyZSB0aGUgIm1hbnkiIHNpZGUgCi0JICogb2YgYW4gYXNzb2NpYXRpb24gdG8gYmUgdGhlIG93bmVyIChsaWtlIEVKQjMpLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hbnlTaWRlSXNBc3NvY2lhdGlvbk93bmVyKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlQ29uZmlnRmlsZSgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhnZXRQcm9wZXJ0eShVUERBVEVfQ09ORklHX0ZJTEUsIG51bGwsIG51bGwpKTsgLy9kZWZhdWx0cyB0byB0cnVlCi0JfQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZUNvbmZpZ0ZpbGUoYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAodmFsdWUpIHsgLy9kZWZhdWx0IGlzIHRydWUKLQkJCXNldFByb3BlcnR5KFVQREFURV9DT05GSUdfRklMRSwgbnVsbCwgbnVsbCwgbnVsbCk7IC8vcmVtb3ZlIGl0Ci0JCX0gZWxzZSB7Ci0JCQlzZXRCb29sZWFuUHJvcGVydHkoVVBEQVRFX0NPTkZJR19GSUxFLCB2YWx1ZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIFZlbG9jaXR5IHRlbXBsYXRlcyBtZXRob2RzCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFJldHVybnMgYSBnZXR0ZXIgbWV0aG9kIG5hbWUgZ2l2ZW4gYSBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlHZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gImdldCIrU3RyaW5nVXRpbC5pbml0VXBwZXIocHJvcGVydHlOYW1lKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhIHNldHRlciBtZXRob2QgbmFtZSBnaXZlbiBhIHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eVNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAic2V0IitTdHJpbmdVdGlsLmluaXRVcHBlcihwcm9wZXJ0eU5hbWUpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBTdHJpbmdVdGlsLnF1b3RlKHMsICciJyk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgcXVvdGUoYm9vbGVhbiBiKSB7Ci0JCXJldHVybiBxdW90ZShTdHJpbmcudmFsdWVPZihiKSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgcXVvdGUoaW50IGkpIHsKLQkJcmV0dXJuIHF1b3RlKFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0JLyoqCi0JICogQXBwZW5kcyBhbiBhbm5vdGF0aW9uIG1lbWJlciBuYW1lIGFuZCB2YWx1ZSB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzIFRoZSBhbm5vdGF0aW9uIG1lbWJlcnMgc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIG1lbWJlclZhbHVlIFRoZSBtZW1iZXIgdmFsdWUsIGlmIG51bGwgb3IgZW1wdHkgc3RyaW5ncyB0aGVuIAotCSAqIG5vdGhpbmcgaXMgYXBwZW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gd2hldGhlciB0byBkb3VibGUgcXVvdGUgdGhlIG1lbWJlciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGFwcGVuZEFubm90YXRpb24oU3RyaW5nIHMsIFN0cmluZyBtZW1iZXJOYW1lLCBTdHJpbmcgbWVtYmVyVmFsdWUsIGJvb2xlYW4gcXVvdGUpIHsKLQkJaWYgKG1lbWJlclZhbHVlID09IG51bGwgfHwgbWVtYmVyVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHM7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocyk7Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgIT0gMCkgewotCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG1lbWJlck5hbWUpOwotCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCWlmIChxdW90ZSkgewotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQobWVtYmVyVmFsdWUpOwotCQlpZiAocXVvdGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzSkRLMV81KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLSBwcml2YXRlIG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIGN1c3RvbWl6YXRpb24gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gCi0JICogKHBlcnNpc3RlZCkgY3VzdG9taXplci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpICB7Ci0JCW1UYWJsZU5hbWVzID0gY3VzdG9taXplci5tVGFibGVOYW1lczsKLQkJbUFzc29jaWF0aW9ucyA9IGN1c3RvbWl6ZXIubUFzc29jaWF0aW9uczsKLQkJbVByb3BzID0gY3VzdG9taXplci5tUHJvcHM7Ci0JCWlmKCBtU2NoZW1hID09IG51bGwgKQotCQkJcmV0dXJuOwotCQkKLQkJLypyZW1vdmUgaW52YWxpZCB0YWJsZSBuYW1lcyovCi0JCWZvciAoaW50IGkgPSBtVGFibGVOYW1lcy5zaXplKCktMTsgaSA+PSAwOyAtLWkpIHsKLQkJCVN0cmluZyB0YWJsZU5hbWUgPSBtVGFibGVOYW1lcy5nZXQoaSk7Ci0JCQlpZiAobVNjaGVtYS5nZXRUYWJsZU5hbWVkKCB0YWJsZU5hbWUpID09IG51bGwpIHsKLQkJCQltVGFibGVOYW1lcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQkJaWYoIG1Bc3NvY2lhdGlvbnMhPW51bGwgKXsKLQkJCS8qcmVzdG9yZSB0aGUgYXNzb2NpYXRpb25zKi8KLQkJCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGl0ZXIgPSBtQXNzb2NpYXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWFzc29jaWF0aW9uLnJlc3RvcmUodGhpcyk7Ci0JCQl9Ci0JCQkvKmFkZCB0aGUgZm9yZWlnbiBrZXlzIGFzc29jaWF0aW9ucyBqdXN0IGluIGNhc2UgdGhlIHRhYmxlcyBjaGFuZ2VkIHNpbmNlIAotCQkJICogdGhlIGxhc3QgdGltZSB0aGUgc3RhdGUgd2FzIHBlcnNpc3RlZC4gUGFzcyBjaGVja0V4aXN0aW5nIHRydWUgc28gdGhhdCB0aGUgCi0JCQkgKiBhc3NvY2lhdGlvbnMgcmVzdG9yZWQgYWJvdmUgYXJlIG5vdCBvdmVyd3JpdHRlbi4qLwotCQkJYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyh0cnVlLypjaGVja0V4aXN0aW5nKi8pOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtleSBpbiBtUHJvcHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIAotCSAqIHByb3BlcnR5TmFtZSwgdGFibGUgYW5kIGNvbHVtbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wS2V5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCWlmICh0YWJsZU5hbWUgPT0gbnVsbCkgewotCQkJdGFibGVOYW1lID0gTlVMTF9UQUJMRTsKLQkJfQotCQlpZiAoY29sTmFtZSA9PSBudWxsKSB7Ci0JCQljb2xOYW1lID0gTlVMTF9DT0xVTU47Ci0JCX0KLQkJcmV0dXJuIHRhYmxlTmFtZSArICcuJyArIGNvbE5hbWUgKyAnLicgKyBwcm9wZXJ0eU5hbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhlIAotCSAqIGN1cnJlbnQgdGFibGVzLgotCSAqLwotCXByaXZhdGUgTGlzdDxBc3NvY2lhdGlvbj4gZ2V0QXNzb2NpYXRpb25zKGJvb2xlYW4gdmFsaWRPbmx5KXsKLQkJaWYgKG1Bc3NvY2lhdGlvbnMgPT0gbnVsbCkgewotCQkJbUFzc29jaWF0aW9ucyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PEFzc29jaWF0aW9uPigpOwotCQkJCi0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKGZhbHNlLypjaGVja0V4aXN0aW5nKi8pOwotCQl9IGVsc2UgaWYgKG1JbnZhbGlkRm9yZWlnbkFzc29jaWF0aW9ucykgewotCQkJbUludmFsaWRGb3JlaWduQXNzb2NpYXRpb25zID0gZmFsc2U7Ci0JCQkKLQkJCWFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnModHJ1ZS8qY2hlY2tFeGlzdGluZyovKTsKLQkJfQotCQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnM7Ci0JCWlmICh2YWxpZE9ubHkpIHsKLQkJCWlmIChtVmFsaWRBc3NvY2lhdGlvbnMgPT0gbnVsbCkgewotCQkJCS8qZmlsdGVyIG91dCB0aGUgaW52YWxpZCBhc3NvY2lhdGlvbnMqLwotCQkJCW1WYWxpZEFzc29jaWF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QXNzb2NpYXRpb24+KG1Bc3NvY2lhdGlvbnMuc2l6ZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMCwgbiA9IG1Bc3NvY2lhdGlvbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbUFzc29jaWF0aW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChhc3NvY2lhdGlvbi5pc1ZhbGlkKCkpIHsKLQkJCQkJCW1WYWxpZEFzc29jaWF0aW9ucy5hZGQoYXNzb2NpYXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYXNzb2NpYXRpb25zID0gbVZhbGlkQXNzb2NpYXRpb25zOwotCQl9IGVsc2UgewotCQkJYXNzb2NpYXRpb25zID0gbUFzc29jaWF0aW9uczsKLQkJfQotCQlyZXR1cm4gYXNzb2NpYXRpb25zOwotCX0KLQlwcml2YXRlIHZvaWQgYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyhib29sZWFuIGNoZWNrRXhpc3RpbmcpIHsKLQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSBnZXRUYWJsZU5hbWVzKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gdGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlPUk1HZW5UYWJsZSB0YWJsZSA9IGdldFRhYmxlKGl0ZXIubmV4dCgpKTsKLQkJCWFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnModGFibGUsIGNoZWNrRXhpc3RpbmcpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKE9STUdlblRhYmxlIHRhYmxlLCBib29sZWFuIGNoZWNrRXhpc3RpbmcpIHsKLQkJaWYodGFibGU9PW51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkKLQkJTGlzdDxGb3JlaWduS2V5SW5mbz4gZktleXMgPSBudWxsOwotCQkKLQkJdHJ5ewotCQkJZktleXMgPSBEVFBVdGlsLmdldEZvcmVpZ25LZXlzKHRhYmxlLmdldERiVGFibGUoKSk7Ci0JCX1jYXRjaChFeGNlcHRpb24gaXNlKXsKLQkJCS8vd29ya2Fyb3VuZCBEYWxpIGJ1ZyBmb3Igbm93Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCBmS2V5cy5zaXplKCk9PTAgKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdDxBc3NvY2lhdGlvbj4gYWRkZWRBc3NvY2lhdGlvbnMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvbj4oKTsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5SW5mbz4gaXRlciA9IGZLZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUZvcmVpZ25LZXlJbmZvIGZraSA9IGl0ZXIubmV4dCgpOwotCQkJT1JNR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZ2V0VGFibGUoZmtpLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSk7Ci0JCQlpZiAocmVmZXJlbmNlZFRhYmxlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbmV3IEFzc29jaWF0aW9uKHRoaXMsIHRhYmxlLmdldE5hbWUoKSwgZmtpLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKQotCQkJCQkJLCByZWZlcmVuY2VkVGFibGUuZ2V0TmFtZSgpLCBma2kuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkpOwotCQkJYXNzb2NpYXRpb24uY29tcHV0ZUNhcmRpbmFsaXR5KCk7Ci0JCQkvL0RlZmVyIHRoZSBjaGVjayBvZiBzaW1pbGFyQXNzb2NpYXRpb25FeGlzdHMgYWZ0ZXIgY29tcHV0ZU1hbnlUb01hbnkoKQotCQkJLy9vdGhlcndpc2UgdGhlIE1UTSBhc3NvY2lhdGlvbiB3aWxsIG5vdCBjb21wdXRlZCBjb3JyZWN0bHkgaW4gc29tZSBjYXNlcy4KLQkJCS8vaWYgKGNoZWNrRXhpc3RpbmcgJiYgc2ltaWxhckFzc29jaWF0aW9uRXhpc3RzKGFzc29jaWF0aW9uKSkgewotCQkJLy8JY29udGludWU7Ci0JCQkvL30KLQkJCWFkZGVkQXNzb2NpYXRpb25zLmFkZChhc3NvY2lhdGlvbik7Ci0JCX0KLQkJCi0JCUFzc29jaWF0aW9uIG0ybSA9IGNvbXB1dGVNYW55VG9NYW55KHRhYmxlLCBhZGRlZEFzc29jaWF0aW9ucyk7Ci0JCWlmIChtMm0gIT0gbnVsbCkgewotCQkJLypkbyBub3QgZ2VuZXJhdGUgdGhlIDIgbWFueS10by1vbmUqLwotCQkJYWRkZWRBc3NvY2lhdGlvbnMuY2xlYXIoKTsKLQkJCWFkZGVkQXNzb2NpYXRpb25zLmFkZCgwLCBtMm0pOwotCQl9Ci0JCS8vcmVtb3ZlIHRoZSBhc3NvY2lhdGlvbiBpZiBhbHJlYWR5IGV4aXN0aW5nCi0JCUl0ZXJhdG9yPEFzc29jaWF0aW9uPiBpdCA9ICBhZGRlZEFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyAKLQkJd2hpbGUoIGl0Lmhhc05leHQoKSApewotCQkJQXNzb2NpYXRpb24gbmV3QXNzb2NpYXRpb24gPSBpdC5uZXh0KCk7Ci0JCQlmb3IoIEFzc29jaWF0aW9uIGFzc29jaWF0aW9uIDogbUFzc29jaWF0aW9ucyApewotCQkJCWlmKCBuZXdBc3NvY2lhdGlvbi5lcXVhbHMoIGFzc29jaWF0aW9uICkpewotCQkJCQlpdC5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbUFzc29jaWF0aW9ucy5hZGRBbGwoYWRkZWRBc3NvY2lhdGlvbnMpOwotCX0KLQlwcml2YXRlIEFzc29jaWF0aW9uIGNvbXB1dGVNYW55VG9NYW55KE9STUdlblRhYmxlIHRhYmxlLCBMaXN0PEFzc29jaWF0aW9uPiBhZGRlZEFzc29jaWF0aW9ucykgewotCQkvKiogbWFueS10by1tYW55IGFzc29jaWF0aW9ucyBpZjoKLQkJICogLSBhZGRlZEFzc29jaWF0aW9ucyBjb250YWlucyAyIG1hbnktdG8tb25lIGFzc29jaWF0aW9ucwotCQkgKiAtIHRhYmxlcyB0MSBhbmQgdDIgZG9lcyBOT1QgaGF2ZSB0byBiZSBkaWZmZXJlbnQoIGZvciBzZWxmLU1UTS1zZWxmIHNpdHVhdGlvbikKLQkJICogLSA8Y29kZT50YWJsZTwvY29kZT4gY29udGFpbnMgb25seSB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucy4KLQkJICogCi0JCSAqIE5vdGU6IGZvbGxvd2luZyByZXN0cmljdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQ6Ci0JCSAqIC10YWJsZSBoYXMgb25seSB0d28gY29sdW1ucwotCQkgKiAtdDEgYW5kIHQyIG11c3QgYmUgZGlmZmVyZW50Ci0JCSAqIC10aGUgcHJpbWFyeSBrZXkgb2YgPGNvZGU+dGFibGU8L2NvZGU+IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGl0cyBmb3JlaWduIAotCQkgKiAJa2V5cyB0byB0MSBhbmQgdDIuKi8KLQkJCi0JCWlmIChhZGRlZEFzc29jaWF0aW9ucy5zaXplKCkgIT0gMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vTVRNIHRhYmxlIHNob3VsZCBoYXZlIHR3byBNVE8gcmVsYXRpb25zIHRvIG9yZ2luYWwgdGFibGVzCi0JCUFzc29jaWF0aW9uIGFzc29jMSA9IGFkZGVkQXNzb2NpYXRpb25zLmdldCgwKTsKLQkJQXNzb2NpYXRpb24gYXNzb2MyID0gYWRkZWRBc3NvY2lhdGlvbnMuZ2V0KDEpOwotCQlpZiAoYXNzb2MxLmdldENhcmRpbmFsaXR5KCkgIT0gQXNzb2NpYXRpb24uTUFOWV9UT19PTkUKLQkJCQl8fCBhc3NvYzIuZ2V0Q2FyZGluYWxpdHkoKSAhPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvL01UTSB0YWJsZSBzaG91bGQgb25seSBpbmNsdWRlIGZvcmVpZ24ga2V5IGNvbHVtbnMKLQkJZm9yKCBPUk1HZW5Db2x1bW4gY29sIDogdGFibGUuZ2V0Q29sdW1ucygpKXsKLQkJCWlmKCAhY29sLmlzRm9yZWlnbktleSgpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCi0JCU9STUdlblRhYmxlIHQxID0gYXNzb2MxLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQlPUk1HZW5UYWJsZSB0MiA9IGFzc29jMi5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQotCQlpZiggdDEuZ2V0TmFtZSgpLmVxdWFscyh0YWJsZS5nZXROYW1lKCkpIHx8IHQyLmdldE5hbWUoKS5lcXVhbHModGFibGUuZ2V0TmFtZSgpKSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9NYWtlIGEgZ3Vlc3Mgd2hpY2ggdGFibGUgaXMgdGhlIG93bmluZyBzaWRlIG9mIHRoZSBNVE0gcmVsYXRpb24KLQkJLy9TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2ODQ0NQotCQkvL0xvZ2ljIGJvcnJvd2VkIGZyb20gRFRQVGFibGVXcmFwcGVyLmdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKQotCQlpZiggIXRhYmxlLmdldE5hbWUoKS5lcXVhbHModDEuZ2V0TmFtZSgpICsgIl8iICsgdDIuZ2V0TmFtZSgpICkgKSB7Ci0JCQkvL3N3YXAgdDEgYW5kIHQyICAKLQkJCU9STUdlblRhYmxlIHQzID0gdDE7Ci0JCQl0MT10MjsKLQkJCXQyPXQzOwotCQkJLy9zd2FwIGFzc29jMSBhbmQgYXNzb2MyCi0JCQlBc3NvY2lhdGlvbiBhc3NvYzM9YXNzb2MxOwotCQkJYXNzb2MxPWFzc29jMjsKLQkJCWFzc29jMj1hc3NvYzM7Ci0JCX0KLQkJCi0vL0NvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGUgYXNzdW1wdGlvbiBpcyB0b28gcmVzdHJpY3RpdmU6IAotLy90aGlzIGNoZWNrIHdpbGwgcHJldmVudCBnZW5lcmF0aW5nIE1UTSBtYXBwaW5nIHRhYmxlIG5vdCBoYXZpbmcgCi0vL3ByaW1hcnkga2V5IGRlZmluZWQgCQkKLS8vCQlMaXN0IHBrTmFtZXMgPSBEVFBVdGlsLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lcyh0YWJsZS5nZXREYlRhYmxlKCkpOwotLy8JCWlmIChwa05hbWVzLnNpemUoKSAhPSB0YWJsZS5nZXRDb2x1bW5OYW1lcygpLnNpemUoKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJTGlzdCBma05hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoYXNzb2MxLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSk7IC8vY2xvbmUgYmVjYXVzZSB3ZSBtb2RpZnkgYnkgYWRkQWxsIGJlbG93Ci0vLwkJZmtOYW1lcy5hZGRBbGwoYXNzb2MyLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSk7Ci0vLwkJaWYgKCFDb2xsZWN0aW9uVXRpbC5lcXVhbHNJZ25vcmVPcmRlcihwa05hbWVzLCBma05hbWVzKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0JCUFzc29jaWF0aW9uIG0ybSA9IG5ldyBBc3NvY2lhdGlvbih0aGlzLCB0MS5nZXROYW1lKCkvKnJlZmVycmVyVGFibGVOYW1lKi8sIGFzc29jMS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKS8qcmVmZXJyZXJDb2xOYW1lcyovCi0JCQkJLCB0Mi5nZXROYW1lKCkvKnJlZmVyZW5jZWRUYWJsZU5hbWUqLywgYXNzb2MyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLypyZWZlcmVuY2VkQ29sTmFtZXMqLwotCQkJCSwgdGFibGUuZ2V0TmFtZSgpLCBhc3NvYzEuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLypyZWZlcnJlckpvaW5Db2xOYW1lcyovLCBhc3NvYzIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLypyZWZlcmVuY2VkSm9pbkNvbE5hbWVzKi8pOwotCQltMm0uc2V0Q3VzdG9tKGZhbHNlKTsKLQkJcmV0dXJuIG0ybTsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLSBGaWxlSGVhZGVyIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBUaGUgaGVhZGVyIG9mIHRoZSBjdXN0b21pemF0aW9uIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUhlYWRlciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJLyoqCi0JCSAqIFNob3VsZCBiZSBhcmd1bWVudC1sZXNzIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiAKLQkJICogdGhlIGRlLXNlcmlhbGl6YXRpb24gcHJvY2Vzcy4KLQkJICovCi0JCXB1YmxpYyBGaWxlSGVhZGVyKCkgewotCQkJbVZlcnNpb24gPSBGSUxFX1ZFUlNJT047Ci0JCX0KLQkJaW50IG1WZXJzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT1JNR2VuVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2YWQwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09STUdlblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQuRW50aXR5R2VuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLkRUUFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgT1JNIGdlbmVyYXRpb24gcHJvcGVydGllcyBmb3IgYSBkYXRhYmFzZSB0YWJsZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNyZWF0ZWQvY2hhbmdlZCBieSB0aGUgZ2VuZXJhdGlvbiB3aXphcmQsIGFuZAotICogZ2VuZXJhdGVkIHVzaW5nIFZlbG9jaXR5IHRlbXBsYXRlcy4gVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlCi0gKiBwZXJzaXN0ZWQvcmV0cmlldmVkIHVzaW5nIDxjb2RlPk9STUdlbkN1c3RvbWl6ZXI8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPUk1HZW5UYWJsZQotewotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIExpc3Q8T1JNR2VuQ29sdW1uPiBtQ29sdW1uczsKLQlwcml2YXRlIFRhYmxlIG1EYlRhYmxlOwotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gY29sdW1uVHlwZXNNYXAgPSAgbnVsbDsKLQkvKioKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIFRoZSBkYXRhYmFzZSB0YWJsZSBvciBudWxsIGlmIHRoaXMgdGFibGUgaXMgdXNlZCB0byBnZXQvc2V0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0YWJsZSBwcm9wZXJ0aWVzIChwcm9wZXJ0aWVzIHRoYXQgYXBwbHkgdG8gYWxsCi0JICogICAgICAgICAgICB0YWJsZXMgdW5sZXNzIG92ZXJyaWRlbikuCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlKFRhYmxlIHRhYmxlLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIoKTsKLQkJbURiVGFibGUgPSB0YWJsZTsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCX0KLQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBtQ3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0YWJsZSBpcyBpcyB1c2VkIHRvIGdldC9zZXQgdGhlIGRlZmF1bHQgdGFibGUKLQkgKiBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdHNUYWJsZSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5KHByb3BOYW1lLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgZ2V0TmFtZSgpLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSB2YWx1ZSkgewotCQkJc2V0Q3VzdG9taXplZChwcm9wTmFtZSwgbnVsbCk7IC8vIHJlbW92ZSB0aGUgcHJvcGVydHkKLQkJfQotCQllbHNlIHsKLQkJCWdldEN1c3RvbWl6ZXIoKS5zZXRCb29sZWFuUHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXROYW1lKCksIG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCXJldHVybiBtRGJUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG1EYlRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JCXJldHVybiBtRGJUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKb2luVGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJaWYgKG1EYlRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKG1EYlRhYmxlKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYlRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSBzY2hlbWEgY29udGFpbmluZyB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCWlmIChEVFBVdGlsLmlzRGVmYXVsdFNjaGVtYShtRGJUYWJsZSkgfHwgbURiVGFibGUuZ2V0U2NoZW1hKCk9PW51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNjaGVtYU5hbWUgPSBtRGJUYWJsZS5nZXRTY2hlbWEoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBzY2hlbWFOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUZvbGRlcihTdHJpbmcgc3JjRm9sZGVyKXsKLQkJc2V0Q3VzdG9taXplZChTUkNfRk9MREVSLCBzcmNGb2xkZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZvbGRlcigpewotCQlTdHJpbmcgc3JjRm9sZGVyID0gY3VzdG9taXplZChTUkNfRk9MREVSKTsKLQkJcmV0dXJuIHNyY0ZvbGRlciA9PSBudWxsID8gIiIgOiBzcmNGb2xkZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0U3RhdGVtZW50cygpewotCQlidWlsZENvbHVtblR5cGVzTWFwKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBwYWNrYWdlcyA9IGNvbHVtblR5cGVzTWFwLmtleVNldCgpOwotCQlTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoIFN0cmluZyBzIDogcGFja2FnZXMgKSB7Ci0JCQlyZXQuYXBwZW5kKCAiaW1wb3J0ICIgKyBzICsgIjtcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gYXNzb2NpYXRpb25Sb2xlcyA9IGdldEFzc29jaWF0aW9uUm9sZXMoKTsKLQkJZm9yICggQXNzb2NpYXRpb25Sb2xlIHJvbGUgOiAgYXNzb2NpYXRpb25Sb2xlcyApIHsKLQkJCWlmICggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uT05FX1RPX01BTlkgKQotCQkJCQl8fCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkgKSApIHsKLQkJCQlyZXQuYXBwZW5kKCAiaW1wb3J0ICIgKyBnZXREZWZhdWx0Q29sbGVjdGlvblR5cGUoKSArICI7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBpbXBvcnQgc3RhdGVtZW50cyBmb3IgdHlwZXMgZnJvbSBqYXZheC5wZXJzaXN0ZW5jZSBwYWNrYWdlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEphdmF4UGVyc2lzdGVuY2VJbXBvcnRTdGF0ZW1lbnRzKCkgewotCQlTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5O1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPOiBvbmx5IGlmIEBDb2x1bW5zIGlzIG5lZWRlZAotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjtcbiIpOy8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPOiBvbmx5IGlmIHRoZXJlIGlzIEBJZAotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkO1xuIik7Ly8kTk9OLU5MUy0xJAotCQlpZiggIXRoaXMuaXNEZWZhdWx0bmFtZSgpICkKLQkJCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGU7XG4iKTsvLyROT04tTkxTLTEkCi0JCWlmKCB0aGlzLmlzQ29tcG9zaXRlS2V5KCkgKQotCQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkO1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXBwZW5kIGphdmF4LnBlcnNpc3RlbmNlIHBhY2thZ2UgaW1wb3J0cwotCQlIYXNoU2V0PFN0cmluZz4ganBhSW1wb3J0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsgCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBhc3NvY2lhdGlvblJvbGVzID0gZ2V0QXNzb2NpYXRpb25Sb2xlcygpOwotCQlmb3IoIEFzc29jaWF0aW9uUm9sZSByb2xlIDogIGFzc29jaWF0aW9uUm9sZXMgKXsKLQkJCWlmKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FICkgKXsKLQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsiICk7Ly8kTk9OLU5MUy0xJAotCQkJfWVsc2V7Ci0JCQkJaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZICkgKXsKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55O1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQl9ZWxzZSBpZiggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19PTkUgKSApewotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uO1xuIiApOyAvLyROT04tTkxTLTEkCi0JCQkJfWVsc2UgaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSApICl7Ci0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnk7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGU7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1ucztcbiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWZvciggU3RyaW5nIHM6IGpwYUltcG9ydHMpewotCQkJcmV0LmFwcGVuZChzKTsKLQkJfQotCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkQ29sdW1uVHlwZXNNYXAoKXsKLQkJaWYgKCBjb2x1bW5UeXBlc01hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29sdW1uVHlwZXNNYXA7Ci0JCX0KLQkJY29sdW1uVHlwZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yICggT1JNR2VuQ29sdW1uIGNvbCA6IHRoaXMuZ2V0Q29sdW1ucygpICkgewotCQkJU3RyaW5nIHR5cGUgPSBjb2wuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQlpZiAoICFjb2wuaXNQYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5KCkKLQkJCQkJJiYgIWNvbC5pc0ZvcmVpZ25LZXkoKQotCQkJCQkmJiAhdHlwZS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSAmJiB0eXBlLmluZGV4T2YoJy4nKT4wICkgewotCQkJCVN0cmluZyBzaW1wbGVUeXBlPSB0eXBlLnN1YnN0cmluZyggdHlwZS5sYXN0SW5kZXhPZignLicpKzEgKTsKLQkJCQljb2x1bW5UeXBlc01hcC5wdXQodHlwZSwgc2ltcGxlVHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtblR5cGVzTWFwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsaWZpZWRDb2xUeXBlKFN0cmluZyBmcXRuICkgewotCQlIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBidWlsZENvbHVtblR5cGVzTWFwKCk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG1hcC5nZXQoZnF0bik7Ci0JCWlmICggIHR5cGVOYW1lICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gdHlwZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZxdG47Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhY2thZ2UgZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3MgKGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQKLQkgKiBwYWNrYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHBrZykgewotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkoUEFDS0FHRSwgcGtnLCBnZXROYW1lKCksIG51bGwpOyAKLQkJLy8gbm90IGNhbGxpbmcgc2V0Q3VzdG9taXplZCBzbyB0aGF0IGVtcHR5IHN0cmluZ3MgZG8gbm90IGdldCBudWxsZWQgb3V0LgotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgcGFja2FnZSAoZW1wdHkgc3RyaW5nIGZvciB0aGUgZGVmYXVsdCBwYWNrYWdlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGN1c3RvbWl6ZWQoUEFDS0FHRSk7Ci0JCXJldHVybiBwYWNrYWdlTmFtZSA9PSBudWxsID8gIiIgOiBwYWNrYWdlTmFtZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBKYXZhIGNsYXNzIG5hbWUgKG5vdCBxdWFsaWZpZWQpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoQ0xBU1NfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCS8vIG5hbWUgPSBTdHJpbmdVdGlsLnRhYmxlTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQkJLy8gbmFtZSA9IFN0cmluZ1V0aWwuaW5pdFVwcGVyKG5hbWUpOwotCQkJbmFtZSA9IEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZShnZXROYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnNpbmd1bGFyaXNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCS8qCi0JCSAqIGlmIHRoZSBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSAocG9zc2libHkgY29tcHV0ZWQpIGNsYXNzIG5hbWUKLQkJICogdGhlbiBub3RoaW5nIHRvIGRvCi0JCSAqLwotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKGNsYXNzTmFtZSwgZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKENMQVNTX05BTUUsIGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmFtZSBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGEgdmFyaWFibGUgb3IgY2xhc3MgbmFtZS4gVGhpcyBpcwotCSAqIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzaW5ndWxhcgotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgbmFtZSBzaG91bGQgYmUgc2luZ3VsYXIgb3IgcGx1cmFsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyTmFtZShib29sZWFuIHNpbmd1bGFyKSB7Ci0JCVN0cmluZyBuYW1lID0gU3RyaW5nVXRpbC50YWJsZU5hbWVUb1Zhck5hbWUoZ2V0TmFtZSgpKTsKLQkJaWYgKHNpbmd1bGFyKSB7Ci0JCQluYW1lID0gU3RyaW5nVXRpbC5zaW5ndWxhcmlzZShuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnBsdXJhbGlzZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgZ2VuZXJhdGVkIEphdmEgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHF1YWxpZnkoZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBvc2l0ZSBrZXkgSmF2YSBjbGFzcyBuYW1lIChub3QgcXVhbGlmaWVkKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKENPTVBPU0lURV9LRVlfQ0xBU1NfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBnZXRDbGFzc05hbWUoKSArICJQSyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY29tcG9zaXRlIGtleSBKYXZhIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBxdWFsaWZ5KGdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb3NpdGUga2V5IHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiAiaWQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIHRvIGJlIGdlbmVyYXRlZCBmb3IgdGhpcwotCSAqIHRhYmxlLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJaWYgKG1Db2x1bW5zID09IG51bGwpIHsKLQkJCW1Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCQlJdGVyYXRvcjxDb2x1bW4+IGNvbHMgPSBtRGJUYWJsZS5jb2x1bW5zKCk7Ci0JCQl3aGlsZSAoY29scy5oYXNOZXh0KCkpIHsKLQkJCQlDb2x1bW4gYyA9IGNvbHMubmV4dCgpOwotCQkJCU9STUdlbkNvbHVtbiBnZW5Db2x1bW4gPSBnZXRDdXN0b21pemVyKCkuY3JlYXRlR2VuQ29sdW1uKGMpOwotCQkJCWdlbkNvbHVtbi5zZXRHZW5UYWJsZSh0aGlzKTsKLQkJCQltQ29sdW1ucy5hZGQoZ2VuQ29sdW1uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbUNvbHVtbnM7Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpIHsKLQkJSXRlcmF0b3I8Q29sdW1uPiBjb2xzID0gbURiVGFibGUuY29sdW1ucygpOwotCQlMaXN0PFN0cmluZz4gcmV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXdoaWxlIChjb2xzLmhhc05leHQoKSkgewotCQkJQ29sdW1uIGMgPSBjb2xzLm5leHQoKTsKLQkJCXJldC5hZGQoYy5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdGFibGUncwotCSAqIHByaW1hcnkga2V5LgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXQgPSBuZXcgQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IG1EYlRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcmV0LmFkZChuZXcgT1JNR2VuQ29sdW1uKHN0cmVhbS5uZXh0KCksIHRoaXMubUN1c3RvbWl6ZXIpKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG9yIG1hbnkgcHJpbWFyeSBrZXkKLQkgKiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBPUk1HZW5Db2x1bW4gZ2V0UHJpbWFyeUtleUNvbHVtbigpIHsKLQkJT1JNR2VuQ29sdW1uIHBrQ29sID0gbnVsbDsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHBrQ29sdW1ucyA9IGdldFByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JCWlmIChwa0NvbHVtbnMuc2l6ZSgpID09IDEpIHsKLQkJCS8vIENvbHVtbiBkYkNvbCA9IChDb2x1bW4pcGtDb2x1bW5zLmdldCgwKTsKLQkJCXBrQ29sID0gcGtDb2x1bW5zLmdldCgwKTsgLy8gKE9STUdlbkNvbHVtbikKLQkJCQkJCQkJCQkvLyBtQ3VzdG9taXplci5jcmVhdGVHZW5Db2x1bW4oZGJDb2wpOwotCQl9Ci0JCWVsc2UgewotCQkJLyoKLQkJCSAqIGlmIG5vIHBrIGNvbHVtbiB0aGVuIGxvb2sgZm9yIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBpZCBtYXBwaW5nCi0JCQkgKiBraW5kLiBUaGlzIGlzIHNvIHRoYXQgdGhlIHdpemFyZCBjYW4gYmUgdXNlZCB3aXRoIHRhYmxlcyBub3QKLQkJCSAqIGhhdmluZyBwcmltYXJ5IGtleXMuCi0JCQkgKi8KLQkJCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gZ2V0Q29sdW1ucygpOwotCQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sdW1uLmdldE1hcHBpbmdLaW5kKCkuZXF1YWxzKG1DdXN0b21pemVyLmdldElkTWFwcGluZ0tpbmQoKSkpIHsKLQkJCQkJcGtDb2wgPSBjb2x1bW47Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGtDb2w7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIHBrIGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBvc2l0ZUtleSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgZm9yIHRoZSB0aGUgY29sdW1ucyB0aGF0Ci0JICogYXJlIG5vdCBwYXJ0IG9mIGFueSBhc3NvY2lhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZ2VuT25seQotCSAqICAgICAgICAgICAgV2hldGhlciB0byBpbmNsdWRlIG9ubHkgdGhlIGNvbHVtbnMgbWFya2VkIGZvciBnZW5lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlUGsKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcHJpbWFyeSBrbGV5IGNvbHVtbihzKS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZUluaGVyaXRlZAotCSAqICAgICAgICAgICAgV2hldGhlciB0byBpbmNsdWRlIHRoZSBjb2x1bW5zIGFzc29jaWF0ZWQgd2l0aCBKYXZhIHByb3BlcnRpZXMKLQkgKiAgICAgICAgICAgIHRoYXQgZXhpc3QgaW4gdGhlIHN1cGVyIGNsYXNzIChpZiBhbnkpLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0U2ltcGxlQ29sdW1ucyhib29sZWFuIGdlbk9ubHksIGJvb2xlYW4gaW5jbHVkZVBrLCBib29sZWFuIGluY2x1ZGVJbmhlcml0ZWQpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRDb2x1bW5zKCk7Ci0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiByb2xlcyA9IGdldEFzc29jaWF0aW9uUm9sZXMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGdlbk9ubHkgJiYgIWNvbHVtbi5pc0dlbmVyYXRlZCgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uLmlzUHJpbWFyeUtleSgpKSB7Ci0JCQkJaWYgKCFpbmNsdWRlUGsgfHwgaXNDb21wb3NpdGVLZXkoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQuYWRkKDAsIGNvbHVtbik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGlzQ29sdW1uSW5Bc3Njb2NpYXRpb24oY29sdW1uLCByb2xlcykpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlc3VsdC5hZGQoY29sdW1uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0U2ltcGxlQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFNpbXBsZUNvbHVtbnModHJ1ZS8qIGdlbk9ubHkgKi8sIHRydWUvKiBpbmNsdWRlUGsgKi8sIHRydWUvKiBpbmNsdWRlSW5oZXJpdGVkICovKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiBjb2x1bW4gc2hvdWxkIGJlIGdlbmVyYXRlZCB3aXRoIGZhbHNlCi0JICogdXBkYXRhYmxlL2luc2VydGFibGUuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB0aGUgY29sdW1uIGlzIG1hcHBlZCBtb3JlCi0JICogdGhhbiBvbmNlLCB0aGlzIHVzdWFsbHkgaGFwcGVuIHdpdGggY29sdW1ucyBpbiBjb21wb3NpdGUga2V5cyBhbmQKLQkgKiBtYW55LXRvLW9uZSBhc3NvY2lhdGlvbnMuCi0JICogCi0JICogPGJyPgotCSAqIE5vdGUgdGhhdCBmb3IgSGliZXJuYXRlIHRoZSBjb2x1bW4gcGFyYW0gaXMgbnVsbCBiZWNhdXNlIHRoZQotCSAqIGluc2VydC91cGRhdGUgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGZvciB0aGUgbWFueS10by1vbmUgdGFnIGl0c2VsZgotCSAqIGluc3RlYWQgb2YgdGhlIG5lc3RlZCBjb2x1bW4gdGFncyAoYm9ndXMgb2J2aW91c2x5KS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbHVtblVwZGF0ZUluc2VydChBc3NvY2lhdGlvblJvbGUgcm9sZSwgT1JNR2VuQ29sdW1uIGNvbHVtbikgewotCQlpZiAoY29sdW1uID09IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPUk1HZW5Db2x1bW4gYyA9IGl0ZXIubmV4dCgpOwotCQkJCWlmICghaXNDb2x1bW5VcGRhdGVJbnNlcnQocm9sZSwgYykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChjb2x1bW4uaXNQcmltYXJ5S2V5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvKgotCQkgKiBzaG91bGQgbG9vayBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYXNzb2NpYXRpb25zIHVzaW5nIHRoZSBzYW1lIGNvbHVtbgotCQkgKiBhbmQgcmV0dXJuIGZhbHNlLCBidXQgdGhpcyBpcyBwcm9iYWJseSBhbiB1bnVzdWFsIGNhc2UuCi0JCSAqLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLQkgKiBjb2x1bW4gbmFtZXMuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRDb2x1bW5zQnlOYW1lcyhMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gZ2V0Q29sdW1uQnlOYW1lKG5hbWUpOwotCQkJYXNzZXJ0IChjb2x1bW4gIT0gbnVsbCk7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkKGNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW5zIGhhdmluZyB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBPUk1HZW5Db2x1bW4gZ2V0Q29sdW1uQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IGNvbHVtbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sdW1uLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gY29sdW1uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkFzc29jaWF0aW9uUm9sZTwvY29kZT4gb2JqZWN0cyBmb3IgdGhpcyB0YWJsZS4gT25seSB0aGUKLQkgKiBhc3NvY2lhdGlvbiBtYXJrZWQgZm9yIGdlbmVyYXRpb24gYXJlIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBMaXN0PEFzc29jaWF0aW9uUm9sZT4gZ2V0QXNzb2NpYXRpb25Sb2xlcygpIHsKLQkJLyoKLQkJICogdGhpcyBpcyBub3QgY2FjaGVkIGludGVudGlvbmFsbHkgYmVjYXVzZSBpbnZhbGlkYXRpbmcgdGhlIGNhY2hlIHdpdGgKLQkJICogd2l6YXJkIGNoYW5nZXMgaXMga2luZGEgdHJpY2t5LgotCQkgKi8KLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IGFzc29jaWF0aW9uUm9sZXMgPSBuZXcgQXJyYXlMaXN0PEFzc29jaWF0aW9uUm9sZT4oKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9ucyA9IG1DdXN0b21pemVyLmdldEFzc29jaWF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yPEFzc29jaWF0aW9uPiBpdGVyID0gYXNzb2NpYXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLyoKLQkJCSAqIGNoZWNrIGJvdGggcmVmZXJyZXJhbmQgcmVmZXJlbmNlZCBiZWNhdXNlIGFuIGFzc29jaWF0aW9uIGNvdWxkIGJlCi0JCQkgKiBmcm9tLXRvIHRoZSBzYW1lIHRhYmxlIChlbXBsb3llZS9tYW5hZ2VyKQotCQkJICovCi0JCQlpZiAoYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZSgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpOwotCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJYXNzb2NpYXRpb25Sb2xlcy5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCk7Ci0JCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQlhc3NvY2lhdGlvblJvbGVzLmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFzc29jaWF0aW9uUm9sZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChDTEFTU19ERVNDKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18Ci0JICoge0BsaW5rICNQUk9URUNURURfU0NPUEV9IHx7QGxpbmsgI1BSSVZBVEVfU0NPUEV9LiBUaGlzIG1ldGhvZCBuZXZlcgotCSAqIHJldHVybnMgbnVsbCAoZGVmYXVsdHMgdG8gcHVibGljKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzU2NvcGUoKSB7Ci0JCVN0cmluZyBzY29wZSA9IGN1c3RvbWl6ZWQoQ0xBU1NfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQVUJMSUNfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5kcygpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWQoRVhURU5EUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kcyhTdHJpbmcgYmFzZUNsYXNzKSB7Ci0JCXNldEN1c3RvbWl6ZWQoRVhURU5EUywgYmFzZUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEltcGxlbWVudHMoKSB7Ci0JCVN0cmluZyBzdHIgPSBjdXN0b21pemVkKElNUExFTUVOVFMpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gU3RyaW5nVXRpbC5zdHJUb0xpc3Qoc3RyLCAnLCcsIHRydWUvKiB0cmltICovKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudHMoTGlzdDxTdHJpbmc+IGludGVyZmFjZXMpIHsKLQkJc2V0Q3VzdG9taXplZChJTVBMRU1FTlRTLCBTdHJpbmdVdGlsLmxpc3RUb1N0cihpbnRlcmZhY2VzLCAnLCcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHRoZSBKYXZhIGNsYXNzIGZvciBleHRlbmRzCi0JICogYW5kIGltcGxlbWVudHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUV4dGVuZHNJbXBsZW1lbnRzKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgZXh0ZW5kc0NsYXNzID0gZ2V0RXh0ZW5kcygpOwotCQlpZiAoZXh0ZW5kc0NsYXNzICE9IG51bGwgJiYgIWV4dGVuZHNDbGFzcy5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSAmJiAhZXh0ZW5kc0NsYXNzLmVxdWFscygiT2JqZWN0IikpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoImV4dGVuZHMgIiArIHNpbXBsaWZ5Q2xhc3NOYW1lKGV4dGVuZHNDbGFzcykgKyAiICIpOyAvL2ZpeCBmb3IgYnVnIDI3ODYyNgotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoImltcGxlbWVudHMgU2VyaWFsaXphYmxlIik7IC8vIGFzc3VtaW5nIHRoYXQgdGhlIEphdmEKLQkJCQkJCQkJCQkJCQkvLyBmaWxlIHRlbXBsYXRlIGltcG9ydHMgdGhlCi0JCQkJCQkJCQkJCQkJLy8gamF2YS5pby5TZXJpYWxpemFibGUKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBnZXRJbXBsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlidWZmZXIuYXBwZW5kKCIsICIgKyBzaW1wbGlmeUNsYXNzTmFtZShpdGVyLm5leHQoKSkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzaW1wbGlmeUNsYXNzTmFtZShTdHJpbmcgZnVsbENsYXNzTmFtZSkgewotCQlmaW5hbCBTdHJpbmcgSkFWQV9MQU5HID0gImphdmEubGFuZy4iOwotCQlpZiAoZnVsbENsYXNzTmFtZS5zdGFydHNXaXRoKEpBVkFfTEFORykpIHsKLQkJCXJldHVybiBmdWxsQ2xhc3NOYW1lLnN1YnN0cmluZyhKQVZBX0xBTkcubGVuZ3RoKCkpOwotCQl9Ci0JCVN0cmluZyBwa2cgPSBTdHJpbmdVdGlsLmdldFBhY2thZ2VOYW1lKGZ1bGxDbGFzc05hbWUpOwotCQlpZiAocGtnICE9IG51bGwgJiYgU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMocGtnLCBnZXRQYWNrYWdlKCkpKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVXRpbC5nZXRDbGFzc05hbWUoZnVsbENsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxDbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgZ2VuZXJhdG9yIHNjaGVtZSAoYXNzaWduZWQsIHNlcXVlbmNlLCBldGMpLiBEb2VzIG5vdAotCSAqIHJldHVybiBudWxsLCBkZWZhdWx0cyB0byAiYXNzaWduZWQiIG9yICJpZGVudGl0eSIgZGVwZW5kaW5nIG9uIHdoZXRoZXIKLQkgKiB0aGUgdGFibGUgaGFzIGFuIGlkZW50aXR5IGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkR2VuZXJhdG9yKCkgewotCQlTdHJpbmcgZ2VuZXJhdG9yID0gY3VzdG9taXplZChJRF9HRU5FUkFUT1IpOwotCQlTdHJpbmcgbm9uZUdlbmVyYXRvciA9IGdldEN1c3RvbWl6ZXIoKS5nZXROb0lkR2VuZXJhdG9yKCk7Ci0JCWlmICghaXNEZWZhdWx0c1RhYmxlKCkpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIGRvbmUgbWFpbmx5IGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgY2FzZXMgd2hlcmUgc29tZQotCQkJICogdGFibGVzIGhhdmUgYXV0b2luY3RlbWVudCBwayBhbmQgb3RoZXJzIGFyZSBhc3NpZ25lZC4gSW4gdGhpcwotCQkJICogY2FzZSB0aGlzIG1ha2VzIGl0IHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhICJub25lIgotCQkJICogZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIGludGVycHJldGVkIGRlcGVuZGluZyBvbiB0aGUgY2FzZS4KLQkJCSAqLwotCQkJaWYgKGdlbmVyYXRvciA9PSBudWxsIHx8IGdlbmVyYXRvci5lcXVhbHMobm9uZUdlbmVyYXRvcikpIHsKLQkJCQlPUk1HZW5Db2x1bW4gcGtDb2x1bW4gPSBnZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCQkJaWYgKHBrQ29sdW1uICE9IG51bGwgJiYgRFRQVXRpbC5pc0F1dG9JbmNyZW1lbnQocGtDb2x1bW4uZ2V0RGJDb2x1bW4oKSkpIHsKLQkJCQkJZ2VuZXJhdG9yID0gZ2V0Q3VzdG9taXplcigpLmdldElkZW50aXR5SWRHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlnZW5lcmF0b3IgPSBub25lR2VuZXJhdG9yOwotCQl9Ci0JCXJldHVybiBnZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgaWQgZ2VuZXJhdG9yIHNjaGVtZSAoYXNzaWduZWQsIHNlcXVlbmNlLCBldGMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkR2VuZXJhdG9yKFN0cmluZyBzY2hlbWUpIHsKLQkJc2V0Q3VzdG9taXplZChJRF9HRU5FUkFUT1IsIHNjaGVtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VxdWVuY2UgbmFtZSBmb3IgdGhlIGdpdmVuIHRhYmxlLCBvciBudWxsIGlmIG5vbmUgKG1ha2VzCi0JICogc2Vuc2Ugb25seSB3aGVuIHRoZSBzY2hlbWUgaXMgbmF0aXZlLCBzZXF1ZW5jZSwgLi4pLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2UoKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKFNFUVVFTkNFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZShTdHJpbmcgbmFtZSkgewotCQlzZXRDdXN0b21pemVkKFNFUVVFTkNFLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBuYW1lIGFmdGVyIHJlcGxhY2luZyB0aGUgJHt0YWJsZX0gYW5kICR7cGt9IGJ5IHRoZWlyCi0JICogdmFsdWVzLCBvciBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRTZXF1ZW5jZSgpIHsKLQkJU3RyaW5nIHNlcXVlbmNlID0gZ2V0U2VxdWVuY2UoKTsKLQkJaWYgKHNlcXVlbmNlICE9IG51bGwpIHsKLQkJCS8qIHJlc29sdmUgdGhlICR7dGFibGV9IGFuZCAke3BrfSBwYXR0ZXJucyAqLwotCQkJc2VxdWVuY2UgPSBTdHJpbmdVdGlsLnN0clJlcGxhY2Uoc2VxdWVuY2UsIFRBQkxFX1NFUV9QQVRURVJOLCBnZXROYW1lKCkpOwotCQkJaWYgKHNlcXVlbmNlLmluZGV4T2YoUEtfU0VRX1BBVFRFUk4pID49IDApIHsKLQkJCQlJdGVyYXRvcjxDb2x1bW4+IHBrQ29scyA9IGdldERiVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpOwotCQkJCVN0cmluZyBwa05hbWUgPSBwa0NvbHMuaGFzTmV4dCgpID8gcGtDb2xzLm5leHQoKS5nZXROYW1lKCkgOiBudWxsOwotCQkJCXNlcXVlbmNlID0gU3RyaW5nVXRpbC5zdHJSZXBsYWNlKHNlcXVlbmNlLCBQS19TRVFfUEFUVEVSTiwgcGtOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VxdWVuY2UgIT0gbnVsbCA/IHNlcXVlbmNlLnRvVXBwZXJDYXNlKCkgOiAiIjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxlbWVudEVxdWFscygpIHsKLQkJcmV0dXJuICEidHJ1ZSIuZXF1YWxzKGN1c3RvbWl6ZWQoSU1QTEVNRU5UX0VRVUFMUykpOyAvLyBkZWZhdWx0cyB0bwotCQkJCQkJCQkJCQkJCQkJCS8vIGZhbHNlCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50RXF1YWxzKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oSU1QTEVNRU5UX0VRVUFMUywgdmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgY29sdW1uIHBhcnRpY2lwYXRpbmcgaW4gZXF1YWxzL2hhc2hjb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbHVtbnNJbkVxdWFscygpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRTaW1wbGVDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uaXNVc2VJbkVxdWFscygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMge0BsaW5rICNHRU5FUkFURV9ERExfQU5OT1RBVElPTn0gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcHRpb25hbAotCSAqIERETCBwYXJhbWV0ZXJzIGxpa2UgbGVuZ3RoLCBudWxsYWJsZSwgdW5xaXVlLCBldGMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiBAQ29sdW1uCi0JICogYW5ub3RhdGlvbi4gZGVmYXVsdHMgdG8gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURETEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhjdXN0b21pemVkKE9STUdlbkN1c3RvbWl6ZXIuR0VORVJBVEVfRERMX0FOTk9UQVRJT04pKTsgLy8gZGVmYXVsdHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmYWxzZQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRERMQW5ub3RhdGlvbnMoYm9vbGVhbiBnZW5lcmF0ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihPUk1HZW5DdXN0b21pemVyLkdFTkVSQVRFX0RETF9BTk5PVEFUSU9OLCBnZW5lcmF0ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHtAbGluayAjUFJPUEVSVFlfQUNDRVNTfXx7QGxpbmsgI0ZJRUxEX0FDQ0VTU30gaW5kaWNhdGluZwotCSAqIGhvdyB0aGUgZW50aXR5IHByb3BlcnRpZXMgYXJlIG1hcHBlZC4gRG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvCi0JICoge0BsaW5rICNGSUVMRF9BQ0NFU1N9KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2VzcygpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKEFDQ0VTUyk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBGSUVMRF9BQ0NFU1M7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKFN0cmluZyBhY2Nlc3MpIHsKLQkJYXNzZXJ0IChhY2Nlc3MgPT0gbnVsbCB8fCBhY2Nlc3MuZXF1YWxzKFBST1BFUlRZX0FDQ0VTUykgfHwgYWNjZXNzLmVxdWFscyhGSUVMRF9BQ0NFU1MpKTsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhhY2Nlc3MsIGdldEFjY2VzcygpKSkgewotCQkJc2V0Q3VzdG9taXplZChBQ0NFU1MsIGFjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI0xBWllfRkVUQ0h9fHtAbGluayAjRUFHRVJfRkVUQ0h9IGluZGljYXRpbmcgaG93Ci0JICogdGhlIHRhYmxlIGFzc29jaWF0aW9ucyBhcmUgZmVjaGVkLiBSZXR1cm5zIG51bGwgaWYgdGhlIHByb3ZpZGVyIGRlZmF1bHRzCi0JICogc2hvdWxkIGJlIHVzZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKERFRkFVTFRfRkVUQ0gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGZXRjaChTdHJpbmcgZmV0Y2gpIHsKLQkJYXNzZXJ0IChmZXRjaCA9PSBudWxsIHx8IGZldGNoLmVxdWFscyhMQVpZX0ZFVENIKSB8fCBmZXRjaC5lcXVhbHMoRUFHRVJfRkVUQ0gpKTsKLQkJc2V0Q3VzdG9taXplZChERUZBVUxUX0ZFVENILCBmZXRjaCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbGxlY3Rpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlTRVRfQ09MTEVDVElPTl9UWVBFLCBMSVNUX0NPTExFQ1RJT05fVFlQRQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHtAbGluayAjTElTVF9DT0xMRUNUSU9OX1RZUEV9fHtAbGluayAjU0VUX0NPTExFQ1RJT05fVFlQRX0KLQkgKiBpbmRpY2F0aW5nIHRoZSBKYXZhIHR5cGUgKGZ1bGwgY2xhc3MgbmFtZSkgdXNlZCBmb3IgcHJvcGVydGllcyBvZgotCSAqIGNvbGxlY3Rpb24gdHlwZXMuIFRoaXMgZG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvIGxpc3QpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCkgewotCQlTdHJpbmcgY1R5cGUgPSBjdXN0b21pemVkKERFRkFVTFRfQ09MTEVDVElPTl9UWVBFKTsKLQkJaWYgKGNUeXBlID09IG51bGwpIHsKLQkJCWNUeXBlID0gU0VUX0NPTExFQ1RJT05fVFlQRTsKLQkJfQotCQlyZXR1cm4gY1R5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlQ29sbGVjdGlvblR5cGUoKXsKLQkJIFN0cmluZyB0eXBlID0gZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCk7Ci0JCXJldHVybiB0eXBlLnN1YnN0cmluZyggdHlwZS5sYXN0SW5kZXhPZignLicpICsxICk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKFN0cmluZyBjVHlwZSkgewotCQlhc3NlcnQgKGNUeXBlLmVxdWFscyhMSVNUX0NPTExFQ1RJT05fVFlQRSkgfHwgY1R5cGUuZXF1YWxzKFNFVF9DT0xMRUNUSU9OX1RZUEUpKTsKLQkJc2V0Q3VzdG9taXplZChERUZBVUxUX0NPTExFQ1RJT05fVFlQRSwgY1R5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG91bmQgYW5kIGFueSBvZiBpdHMgY29sdW1ucyBzaG91bGQKLQkgKiBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3VuZEtleVVzZUluRXF1YWxzKCkgewotCQlpZiAoaXNDb21wb3NpdGVLZXkoKSkgewotCQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSBnZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUm9sZVVzZUluRXF1YWxzKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb2x1bW4uaXNVc2VJbkVxdWFscygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgbmFtZSBlbGVtZW50IGluIHRoZSBAVGFibGUgaXMgZGVmYXVsdCBzbyB3ZQotCSAqIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRuYW1lKCkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKGVudGl0eU5hbWUsIG1EYlRhYmxlKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUXVhbGlmaWVzIGEgY2xhc3MgbmFtZSBpZiB0aGVyZSBpcyBhIHBhY2thZ2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmeShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBwa2cgPSBnZXRQYWNrYWdlKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCAmJiBwa2cubGVuZ3RoKCkgIT0gMCkgewotCQkJY2xhc3NOYW1lID0gcGtnICsgJy4nICsgY2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb2x1bW4gaXMgcGFydCBvZiBhbnkgYXNzb2NpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29sdW1uSW5Bc3Njb2NpYXRpb24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgTGlzdDxBc3NvY2lhdGlvblJvbGU+IHJvbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gcm9sZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHJvbGVzLmdldChpKTsKLQkJCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2xzID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJCWZvciAoT1JNR2VuQ29sdW1uIGNvbCA6IGNvbHMpIHsKLQkJCQlpZiAoY29sLmdldE5hbWUoKS5lcXVhbHMoY29sdW1uLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgY2xhdXNlIHRvIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBlcXVhbHMoKSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUVxdWFsc0NsYXVzZSgpIHsKLQkJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBidWYpOwotCQkJaWYgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJCQlidWYuYXBwZW5kKCJcdFx0XHQiKTsKLQkJCQlidWYuYXBwZW5kKCImJiAiKTsKLQkJCX0KLQkJfQotCQlidWYuYXBwZW5kKCI7Iik7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5RXF1YWxzQ2xhdXNlT24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0RGJDb2x1bW4oKS5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgiKHRoaXMuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgiID09IGNhc3RPdGhlci4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCcpJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCIuZXF1YWxzKGNhc3RPdGhlci4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCcpJyk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGNsYXVzZSB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgaGFzQ29kZSgpIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2UoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJYnVmLmFwcGVuZCgiaGFzaCA9IGhhc2ggKiBwcmltZSArICIpOwotCQkJdGhpcy5wcmludFByaW1hcnlLZXlIYXNoQ29kZUNsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBidWYpOwotCQkJYnVmLmFwcGVuZCgnOycpOwotCQkJYnVmLmFwcGVuZCgnXG4nKTsKLQkJCWJ1Zi5hcHBlbmQoIlx0XHQiKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0RGJDb2x1bW4oKS5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBwcmltaXRpdmVOYW1lLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotCQlpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImludCIpKSB7Ci0JCQkvLyB0aGlzLnZhbHVlCi0JCQlidWYuYXBwZW5kKCJ0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJzaG9ydCIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJieXRlIikgfHwgcHJpbWl0aXZlTmFtZS5lcXVhbHMoImNoYXIiKSkgeyAvLyBleHBsaWNpdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXN0Ci0JCQkvLyAoKGludCkgdGhpcy52YWx1ZSkKLQkJCWJ1Zi5hcHBlbmQoIigoaW50KSB0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgnKScpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJsb25nIikpIHsgLy8gY3JpYmJlZCBmcm9tIExvbmcjaGFzaENvZGUoKQotCQkJLy8gKChpbnQpICh0aGlzLnZhbHVlIF4gKHRoaXMudmFsdWUgPj4+IDMyKSkpCi0JCQlidWYuYXBwZW5kKCIoKGludCkgKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIgXiAodGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIiA+Pj4gMzIpKSkiKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiZmxvYXQiKSkgeyAvLyBjcmliYmVkIGZyb20KLQkJCQkJCQkJCQkJCQkvLyBGbG9hdCNoYXNoQ29kZSgpCi0JCQkvLyBqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb0ludEJpdHModGhpcy52YWx1ZSkKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5GbG9hdCIpOwotCQkJYnVmLmFwcGVuZCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImRvdWJsZSIpKSB7IC8vIGNyaWJiZWQgZnJvbQotCQkJCQkJCQkJCQkJCS8vIERvdWJsZSNoYXNoQ29kZSgpCi0JCQkvLyAoKGludCkgKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSBeCi0JCQkvLyAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID4+PiAzMikpKQotCQkJYnVmLmFwcGVuZCgiKChpbnQpICgiKTsKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIpIF4gKCIpOwotCQkJYnVmLmFwcGVuZCgiamF2YS5sYW5nLkRvdWJsZSIpOwotCQkJYnVmLmFwcGVuZCgiLmRvdWJsZVRvTG9uZ0JpdHModGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIikgPj4+IDMyKSkpIik7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgewotCQkJLy8gKHRoaXMudmFsdWUgPyAxIDogMCkKLQkJCWJ1Zi5hcHBlbmQoIih0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiID8gMSA6IDApIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByaW1pdGl2ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotCQlidWYuYXBwZW5kKCJ0aGlzLiIpOwotCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCWJ1Zi5hcHBlbmQoIi5oYXNoQ29kZSgpIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJuYW1lPSIgKyB0aGlzLmdldE5hbWUoKSArICI7IGNvbHVtbnM9IiArIEFycmF5cy50b1N0cmluZyh0aGlzLmdldENvbHVtbk5hbWVzKCkudG9BcnJheSgpKTsKLQl9Ci0KLQkvKiBjbGFzcyBzY29wZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NPUEUgPSAicHVibGljIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRF9TQ09QRSA9ICJwcm90ZWN0ZWQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVkFURV9TQ09QRSA9ICJwcml2YXRlIjsKLQotCS8qIGFjY2VzcyBjb25zdGFudHMuIE5vdGUgdGhhdCB0aGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIHRoZSB1aSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FDQ0VTUyA9ICJwcm9wZXJ0eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BQ0NFU1MgPSAiZmllbGQiOwotCi0JLyoKLQkgKiBkZWZhdWx0IGZlY2ggY29uc3RhbnRzLiBOb3RlIHRoYXQgdGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiB0aGUgZ2VuCi0JICogdmVsb2NpdHkgdGVtcGxhdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkVUQ0ggPSAiZGVmYXVsdEZldGNoIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWllfRkVUQ0ggPSAibGF6eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUdFUl9GRVRDSCA9ICJlYWdlciI7Ci0KLQkvKgotCSAqIGRlZmF1bHQgY29sbGVjdGlvbiB0eXBlIGNvbnN0YW50cy4gTm90ZSB0aGF0IHRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4KLQkgKiB0aGUgZ2VuIHZlbG9jaXR5IHRlbXBsYXRlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0NPTExFQ1RJT05fVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfQ09MTEVDVElPTl9UWVBFID0gImphdmEudXRpbC5TZXQiOwotCi0JLyoqCi0JICogVGhlIHBhdHRlcm4gcmVwbGFjZWQgYnkgdGhlIHRhYmxlIG5hbWUgaW4gdGhlIGlkIGdlbmVyYXRvciBzZXF1ZW5jZSBuYW1lCi0JICogcGFyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfU0VRX1BBVFRFUk4gPSAiJHRhYmxlIjsKLQotCS8qKgotCSAqIFRoZSBwYXR0ZXJuIHJlcGxhY2VkIGJ5IHRoZSBwcmltYXJ5IGtleSBpbiB0aGUgaWQgZ2VuZXJhdG9yIHNlcXVlbmNlIG5hbWUKLQkgKiBwYXJhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19TRVFfUEFUVEVSTiA9ICIkcGsiOwotCi0JLyogY3VzdG9taXphdGlvbiBwcm9wZXJ0aWVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDX0ZPTERFUiA9ICJzcmNGb2xkZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19ERVNDID0gImNsYXNzRGVzYyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfU0NPUEUgPSAiY2xhc3NTY29wZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EUyA9ICJleHRlbmRzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRTID0gImltcGxlbWVudHMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dFTkVSQVRPUiA9ICJpZEdlbmVyYXRvciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0UgPSAic2VxdWVuY2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPU0lURV9LRVlfQ0xBU1NfTkFNRSA9ICJjb21wb3NpdGVLZXlDbGFzc05hbWUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVF9FUVVBTFMgPSAiaW1wbGVtZW50RXF1YWxzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1MgPSAiYWNjZXNzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTExFQ1RJT05fVFlQRSA9ICJkZWZhdWx0Q29sbGVjdGlvblR5cGUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PdmVyd3JpdGVDb25maXJtZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT3ZlcndyaXRlQ29uZmlybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YmYyN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PdmVyd3JpdGVDb25maXJtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBPdmVyd3JpdGVDb25maXJtZXIgewotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgZ2VuZXJhdG9yIHNob3VsZCBvdmVyd3JpdGUgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUuCi0JICovCi0JYm9vbGVhbiBvdmVyd3JpdGUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQotCWZpbmFsIGNsYXNzIEFsd2F5cyBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIElOU1RBTkNFID0gbmV3IEFsd2F5cygpOwotCQlwdWJsaWMgc3RhdGljIE92ZXJ3cml0ZUNvbmZpcm1lciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgQWx3YXlzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBldmVyeXRoaW5nIHdpbGwgYmUgb3ZlcndyaXR0ZW4KLQkJcHVibGljIGJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBhcmcwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiT3ZlcndyaXRlQ29uZmlybWVyLkFsd2F5cyI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCWZpbmFsIGNsYXNzIE5ldmVyIGltcGxlbWVudHMgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBPdmVyd3JpdGVDb25maXJtZXIgSU5TVEFOQ0UgPSBuZXcgTmV2ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE5ldmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBub3RoaW5nIHdpbGwgYmUgb3ZlcndyaXR0ZW4KLQkJcHVibGljIGJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBhcmcwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5OZXZlciI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWQzZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuVmVsb2NpdHlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkuYXBwLlZlbG9jaXR5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudmVsb2NpdHkucnVudGltZS5sb2cuSmRrTG9nQ2h1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5Db21waWxhdGlvblVuaXRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsLlVybFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBwYWNrYWdlIG9mIGVudGl0aWVzIGZvciBhIHNldCBvZiB0YWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlR2VuZXJhdG9yMiB7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5lbnRpdGllcy5nZW4ubG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyIDsgCi0JcHJpdmF0ZSBzdGF0aWMgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciA9IG51bGw7Ci0KLQlzdGF0aWMgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlQ29uZmlybWVyKE92ZXJ3cml0ZUNvbmZpcm1lciBjb25maXJtZXIpewotCQlvdmVyd3JpdGVDb25maXJtZXIgPSBjb25maXJtZXI7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjdXN0b21pemVyCi0JICogQHBhcmFtIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwKLQkgKiBAcGFyYW0gY29weUpkYmNEcml2ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBnZW5lcmF0ZShJSmF2YVByb2plY3QganBhUHJvamVjdCwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBhY2thZ2VHZW5lcmF0b3IyIGdlbmVyYXRvciA9IG5ldyBQYWNrYWdlR2VuZXJhdG9yMigpOwotCQlnZW5lcmF0b3Iuc2V0UHJvamVjdChqcGFQcm9qZWN0KTsKLQkJZ2VuZXJhdG9yLnNldEN1c3RvbWl6ZXIoY3VzdG9taXplcik7Ci0JCQotCQl0cnkgewotCQkJZ2VuZXJhdG9yLmRvR2VuZXJhdGUoICBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCwgSnB0R2VuTWVzc2FnZXMuRXJyb3JfR2VuZXJhdGluZ19FbnRpdGllcywgZSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEN1c3RvbWl6ZXIoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyMikgewotCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyMjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFByb2plY3QoSUphdmFQcm9qZWN0IHByb2ogKXsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHByb2o7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvR2VuZXJhdGUoICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2VuZXJhdGVJbnRlcm5hbCggbW9uaXRvciApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW50ZXJuYWwoIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHRlbXBsRGlyID0gcHJlcGFyZVRlbXBsYXRlc0ZvbGRlcigpOwotCi0JCUxpc3Q8U3RyaW5nPiBnZW5DbGFzc2VzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gdGFibGVOYW1lcyA9IGN1c3RvbWl6ZXIuZ2V0R2VuVGFibGVOYW1lcygpOwotCi0JCS8qIC5qYXZhIHBlciB0YWJsZSwgcGVyc2lzdGVuY2UueG1sLCByZWZyZXNoIHBhY2thZ2UgZm9sZGVyICovCi0JCVN0cmluZyB0YXNrTmFtZSA9IE5MUy5iaW5kKEpwdEdlbk1lc3NhZ2VzLkVudGl0eUdlbmVyYXRvcl90YXNrTmFtZSwgIlRvdGFsICIrIHRhYmxlTmFtZXMuc2l6ZSgpICsgMik7Ly8kTk9OLU5MUy0xJAotCQlwcm9ncmVzcy5iZWdpblRhc2sodGFza05hbWUsIHRhYmxlTmFtZXMuc2l6ZSgpICsgMik7Ci0KLQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHRhYmxlTmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlPUk1HZW5UYWJsZSB0YWJsZSA9IGN1c3RvbWl6ZXIuZ2V0VGFibGUodGFibGVOYW1lKTsKLQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRhYmxlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpOwotCi0JCQlnZW5lcmF0ZUNsYXNzKHRhYmxlLCB0ZW1wbERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgcHJvZ3Jlc3MpOwotCQkJcHJvZ3Jlc3Mud29ya2VkKDEpOwotCi0JCQlnZW5DbGFzc2VzLmFkZCggY2xhc3NOYW1lICk7Ci0JCQkvKgotCQkJICogYWRkIHRoZSBjb21wb3NpdGUga2V5IGNsYXNzIHRvIHBlcnNpc3RlbmNlLnhtbCBiZWNhdXNlIHNvbWUgCi0JCQkgKiBKUEEgcHJvdmlkZXIoZS5nLiBLb2RvKSByZXF1aXJlcyBpdC4gSGliZXJuYXRlIGRvZXNuJ3Qgc2VlbSB0byBjYXJlKS4gCi0JCQkgKi8KLQkJCWlmICh0YWJsZS5pc0NvbXBvc2l0ZUtleSgpKSB7Ci0JCQkJZ2VuQ2xhc3Nlcy5hZGQodGFibGUuZ2V0UXVhbGlmaWVkQ29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkpOwotCQkJfQotCQl9Ci0JCXByb2dyZXNzLmRvbmUoKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgcHJlcGFyZVRlbXBsYXRlc0ZvbGRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vUHJlcGFyZSB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgZm9sZGVyOgotCQkvL0lmIHRoZSBwbHVnLWluIGlzIHBhY2thZ2VkIGFzIGEgSkFSLCB3ZSBuZWVkIGV4dHJhY3QgdGhlIHRlbXBsYXRlIAotCQkvL2ZvbGRlciBpbnRvIHRoZSBwbHVnLWluIHN0YXRlIGxvY2F0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IFZlbG9jaXR5Ci0JCS8vc2luY2Ugd2UgdXNlIGluY2x1ZGVkIHRlbXBsYXRlcy4KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKcHRHZW5QbHVnaW4uUExVR0lOX0lEKTsKLQkJU3RyaW5nIHRlbXBsYXRlc1BhdGggPSAidGVtcGxhdGVzL2VudGl0aWVzLyI7ICAvLyROT04tTkxTLTEkCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCB0ZW1wbGF0ZXNQYXRoKTsKLQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBwYXRoLCBudWxsKTsKLQkJaWYgKCB1cmwgPT1udWxsICApIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCwgIEpwdEdlbk1lc3NhZ2VzLlRlbXBsYXRlc19ub3RGb3VuZCArICIgIisgIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQgKyAiLyIgKyB0ZW1wbGF0ZXNQYXRoKSApOy8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCVVSTCB0ZW1wbFVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCi0JCS8vSGF2ZSB0aGlzIGNoZWNrIHNvIHRoYXQgdGhlIGNvZGUgd291bGQgd29yayBpbiBib3RoIFBERSBhbmQgSkFSZWQgcGx1Zy1pbiBhdCBydW50aW1lCi0JCUZpbGUgdGVtcGxEaXIgPSBudWxsOwotCQlpZiggVXJsVXRpbC5pc0phclVybCh0ZW1wbFVybCkgKXsKLQkJCXRlbXBsRGlyID0gRmlsZVV0aWwuZXh0cmFjdEZpbGVzRnJvbUJ1bmRsZSggdGVtcGxVcmwsIGJ1bmRsZSwgdGVtcGxhdGVzUGF0aCApOwotCQl9ZWxzZXsKLQkJCXRlbXBsRGlyID0gVXJsVXRpbC5nZXRVcmxGaWxlKHRlbXBsVXJsKTsKLQkJfQotCQkKLQotCQlpZiAodGVtcGxEaXI9PW51bGwgfHwgIXRlbXBsRGlyLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQsICBKcHRHZW5NZXNzYWdlcy5UZW1wbGF0ZXNfbm90Rm91bmQgKyAiICIrICBKcHRHZW5QbHVnaW4uUExVR0lOX0lEICkgKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRlbXBsRGlyOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlcy9DcmVhdGVzIHRoZSAuamF2YSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYSBkYXRhYmFzZSB0YWJsZSAKLQkgKiB3aXRoIHRoZSBnaXZlbiBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbERpciBUaGUgdmVsb2NpdHkgdGVtcGxhdGUgZmlsZSBkaXJlY3RvcnkuIEl0IGlzIGFzc3VtZWQgCi0JICogdGhhdCB0aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgMiBmaWxlcyA8ZW0+bWFpbi5qYXZhLnZtPC9lbT4gCi0JICogYW5kIDxlbT5way5qYXZhLnZtPC9lbT4gCi0JICogQHBhcmFtIHByb2dyZXNzIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ2xhc3MoT1JNR2VuVGFibGUgdGFibGUsIFN0cmluZyB0ZW1wbGF0ZURpclBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHN1YlRhc2tOYW1lID0gTkxTLmJpbmQoSnB0R2VuTWVzc2FnZXMuRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lLCB0YWJsZS5nZXROYW1lKCkpOwotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHN1YlRhc2tOYW1lLCAxMDApOwotCi0JCXRyeXsKLQkJCUlGb2xkZXIgamF2YVBhY2thZ2VGb2xkZXIgPSBnZXRKYXZhUGFja2FnZUZvbGRlcih0YWJsZSwgbW9uaXRvcik7Ci0JCQlJRmlsZSBqYXZhRmlsZSA9IGphdmFQYWNrYWdlRm9sZGVyLmdldEZpbGUoIHRhYmxlLmdldENsYXNzTmFtZSgpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYoIGphdmFGaWxlLmV4aXN0cygpICl7Ci0JCQkJaWYoIG92ZXJ3cml0ZUNvbmZpcm1lciE9bnVsbCAmJiAhb3ZlcndyaXRlQ29uZmlybWVyLm92ZXJ3cml0ZShqYXZhRmlsZS5nZXROYW1lKCkpICkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJLy9KZGtMb2dDaHV0ZSBpbiB0aGlzIHZlcnNpb24gb2YgVmVsb2NpdHkgbm90IGFsbG93IHRvIHNldCBsb2cgbGV2ZWwKLQkJCS8vV29ya2Fyb3VuZCBieSBwcmVzZXQgdGhlIGxvZyBsZXZlbCBiZWZvcmUgVmVsb2NpdHkgaXMgaW5pdGlhbGl6ZWQKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCBMT0dHRVJfTkFNRSApOwotCQkJbG9nZ2VyLnNldExldmVsKCBMZXZlbC5TRVZFUkUgKTsKLQkJCQotCQkJUHJvcGVydGllcyB2ZXAgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdmVwLnNldFByb3BlcnR5KCJmaWxlLnJlc291cmNlLmxvYWRlci5wYXRoIiwgdGVtcGxhdGVEaXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJdmVwLnNldFByb3BlcnR5KCBKZGtMb2dDaHV0ZS5SVU5USU1FX0xPR19KREtfTE9HR0VSLCBMT0dHRVJfTkFNRSApOwotCQkJVmVsb2NpdHlFbmdpbmUgdmUgPSBuZXcgVmVsb2NpdHlFbmdpbmUoKTsKLQkJICAgIHZlLmluaXQodmVwKTsKLQkJICAgIHNtLndvcmtlZCgyMCk7Ci0JCSAgICAKLQkJICAgIGdlbmVyYXRlSmF2YUZpbGUodGFibGUsIGphdmFGaWxlLCB2ZSwgIm1haW4uamF2YS52bSIsIHRydWUvKmlzRG9tYWluQ2xhc3MqLywgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLQkJICAgIHNtLndvcmtlZCg4MCk7Ci0JCSAgICAKLQkJICAgIGlmICh0YWJsZS5pc0NvbXBvc2l0ZUtleSgpKSB7Ci0JCSAgICAJSUZpbGUgY29tcG9zaXRlS2V5RmlsZSA9IGphdmFQYWNrYWdlRm9sZGVyLmdldEZpbGUoIHRhYmxlLmdldENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpKyIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCSAgICAJZ2VuZXJhdGVKYXZhRmlsZSh0YWJsZSwgY29tcG9zaXRlS2V5RmlsZSwgdmUsICJway5qYXZhLnZtIiwgZmFsc2UvKmlzRG9tYWluQ2xhc3MqLywgbW9uaXRvciApOyAvLyROT04tTkxTLTEkCi0JCSAgICB9Ci0JCSAgICAKLQkJCWphdmFGaWxlLnJlZnJlc2hMb2NhbCgxLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQotCQl9IGNhdGNoKFRocm93YWJsZSBlKXsKLQkJCUNvcmVFeGNlcHRpb24gY2UgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEdlblBsdWdpbi5QTFVHSU5fSUQsIEpwdEdlbk1lc3NhZ2VzLlRlbXBsYXRlc19ub3RGb3VuZCArICIiICsgSnB0R2VuUGx1Z2luLlBMVUdJTl9JRCAsIGUpICk7Ly8kTk9OLU5MUy0xJAotCQkJSnB0R2VuUGx1Z2luLmxvZ0V4Y2VwdGlvbiggY2UgKTsKLQkJfQotCQlzbS5zZXRXb3JrUmVtYWluaW5nKDApOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVKYXZhRmlsZShPUk1HZW5UYWJsZSB0YWJsZSwgSUZpbGUgamF2YUZpbGUsIFZlbG9jaXR5RW5naW5lIHZlCi0JCQksIFN0cmluZyB0ZW1wbGF0ZU5hbWUsIGJvb2xlYW4gaXNEb21haW5DbGFzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVmVsb2NpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7Ci0gICAgICAgIGNvbnRleHQucHV0KCJ0YWJsZSIsIHRhYmxlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb250ZXh0LnB1dCgiY3VzdG9taXplciIsIGdldEN1c3RvbWl6ZXIoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0JCVN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl2ZS5tZXJnZVRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgY29udGV4dCwgdyk7Ci0JCQotCQlTdHJpbmcgZmlsZUNvbnRlbnQgPSB3LnRvU3RyaW5nKCk7Ci0JCWlmIChqYXZhRmlsZS5leGlzdHMoKSkgewotCQkJaWYgKGlzRG9tYWluQ2xhc3MpIHsKLQkJCQl1cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzKHRhYmxlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpLCBqYXZhRmlsZSwgZmlsZUNvbnRlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlqYXZhRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZmlsZUNvbnRlbnQuZ2V0Qnl0ZXMoKSksIHRydWUsIHRydWUsIG1vbml0b3IgKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZpbGUoamF2YUZpbGUsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlQ29udGVudC5nZXRCeXRlcygpKSk7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSAoZXhpc3RpbmcpIEphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUZpbGUgVGhlIGV4aXN0aW5nIEphdmEgZmlsZSBvZiB0aGUgY2xhc3MgdG8gdXBkYXRlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlQ29udGVudCBUaGUgbmV3IGZpbGUgY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzKFN0cmluZyBjbGFzc05hbWUsIElGaWxlIGphdmFGaWxlLCBTdHJpbmcgZmlsZUNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkvKnVzZSBDb21waWxhdGlvblVuaXRNb2RpZmllciBpbnN0ZWFkIG9mIGNhbGxpbmcgV2lkZUVudi5nZXRFbnYoKS5zZXRGaWxlQ29udGVudCAKLQkJICogc28gdGhhdCBpZiB0aGUgdW5pdCBpcyB1cCB0byBkYXRlIGlmIGl0IGlzIHVzZWQgYmVmb3JlIGZpbGUgY2hhbmdlIAotCQkgKiBub3RpZmljYXRpb25zIGFyZSBkZWxpdmVyZWQgKHNlZSBFSkIzSW1wb3J0U2NoZW1hV2l6YXJkLnVwZGF0ZUV4aXN0aW5nRG9tYWluQ2xhc3MgZm9yIGV4YW1wbGUpKi8KLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlDb21waWxhdGlvblVuaXRNb2RpZmllciBtb2RpZmllciA9IG5ldyBDb21waWxhdGlvblVuaXRNb2RpZmllcihwcm9qZWN0LCBjbGFzc05hbWUpOwotCQltb2RpZmllci5zZXRKYXZhU291cmNlKGZpbGVDb250ZW50KTsKLQkJbW9kaWZpZXIuc2F2ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlKElGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCQotCQlmaWxlLmNyZWF0ZShjb250ZW50cywgZmFsc2UsIG51bGwvKm1vbml0b3IqLyk7Ci0JfQotCQotCXB1YmxpYyBJRm9sZGVyIGdldEphdmFQYWNrYWdlRm9sZGVyKE9STUdlblRhYmxlIHRhYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldERlZmF1bHRKYXZhU3JvdWNlTG9jYXRpb24gKCBqYXZhUHJvamVjdCAsIHRhYmxlLmdldFNvdXJjZUZvbGRlcigpKSA7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHRhYmxlLmdldFBhY2thZ2UoKTsKLQkJaWYoIHBhY2thZ2VOYW1lPT1udWxsICkgcGFja2FnZU5hbWUgPSIiOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQkJaWYoICFwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpewotCQkJcm9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIHRydWUsIG1vbml0b3IpOwotCQl9CQkKLQkJcmV0dXJuIChJRm9sZGVyKXBhY2thZ2VGcmFnbWVudC5nZXRSZXNvdXJjZSgpOwotCX0KLQkKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldERlZmF1bHRKYXZhU3JvdWNlTG9jYXRpb24oSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBTdHJpbmcgc291cmNlRm9sZGVyKXsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgZGVmYXVsdFNyY1BhdGggPSBudWxsOwotCQlpZiAoanByb2plY3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoanByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJCWZvciAoaW50IGk9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHJvb3RzW2ldLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSApewotCQkJCQkJCWlmKCBpID09IDAgKSAKLQkJCQkJCQkJZGVmYXVsdFNyY1BhdGggPSByb290c1tpXTsKLQkJCQkJCQlTdHJpbmcgcGF0aCA9IHJvb3RzW2ldLmdldFBhdGgoKS50b1N0cmluZygpOyAKLQkJCQkJCQlpZiggcGF0aC5lcXVhbHMoICIvIitzb3VyY2VGb2xkZXIgKSkgewotCQkJCQkJCQlyZXR1cm4gcm9vdHNbaV0gOyAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRHZW5QbHVnaW4ubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0U3JjUGF0aDsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIGFubm90YXRpb24gbmFtZSBidWlsZGVyICoqKioqKioqKioKLQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9UYWdOYW1lcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9UYWdOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg3ZTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvVGFnTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotLyoqCi0gKiBUT0RPOiBtZXJnZSB3aXRoIEpQQSBjbGFzcyA/Ci0gKiBUaGUgSlBBIG1hcHBpbmcgdGFnIGFuZCBhdHRyaWJ1dGUgbmFtZXMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhZ05hbWVzCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfVEFHID0gImJhc2ljIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNDQURFX1RBRyA9ICJjYXNjYWRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFHID0gImNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERURfVEFHID0gImVtYmVkZGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9JRF9UQUcgPSAiZW1iZWRkZWQtaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9UQUcgPSAiZ2VuZXJhdGVkLXZhbHVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9UQUcgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NMQVNTX1RBRyA9ICJpZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9DT0xVTU5fVEFHID0gImpvaW4tY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX1RBRyA9ICJpbnZlcnNlLWpvaW4tY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0JfVEFHID0gImxvYiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19NQU5ZX1RBRyA9ICJtYW55LXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fT05FX1RBRyA9ICJtYW55LXRvLW9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0JZX1RBRyA9ICJtYXBwZWQtYnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19NQU5ZX1RBRyA9ICJvbmUtdG8tbWFueSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX09ORV9UQUcgPSAib25lLXRvLW9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfSk9JTl9DT0xVTU5fVEFHID0gInByaW1hcnkta2V5LWpvaW4tY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9UQUcgPSAidGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVEFHID0gInZlcnNpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfVEFHID0gImpvaW4tdGFibGUiOwotCi0JLypjYXNjYWRlIHRhZ3MqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9DQVNDQURFID0gImFsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVF9DQVNDQURFID0gInBlcnNpc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX0NBU0NBREUgPSAibWVyZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9DQVNDQURFID0gInJlbW92ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9DQVNDQURFID0gInJlZnJlc2giOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvRW50aXR5R2VuVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL0VudGl0eUdlblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTEwYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvRW50aXR5R2VuVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciBlbnRpdHkgZ2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUdlblRvb2xzIHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogY2xhc3MgbmFtZS4KLQkgKiBAc2VlICNjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKFN0cmluZywgYm9vbGVhbiwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoU3RyaW5nIGlkZW50aWZpZXIsIENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKGlkZW50aWZpZXIsIHRydWUsIGNsYXNzTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogYXR0cmlidXRlIChmaWVsZC9wcm9wZXJ0eSkgbmFtZS4KLQkgKiBAc2VlICNjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKFN0cmluZywgYm9vbGVhbiwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKFN0cmluZyBpZGVudGlmaWVyLCBDb2xsZWN0aW9uPFN0cmluZz4gYXR0cmlidXRlTmFtZXMpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoaWRlbnRpZmllciwgZmFsc2UsIGF0dHJpYnV0ZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgKGRhdGFiYXNlKSBpZGVudGlmaWVyIHRvIGEgdW5pcXVlICJKYXZhIHN0eWxlIgotCSAqIGlkZW50aWZpZXI6Ci0JICogICAgIC0gaWYgdGhlIGlkZW50aWZpZXIgaXMgYWxsLWNhcHMsIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gImNhbWVsIGNhc2UiCi0JICogICAgIC0gaWYgdGhlIGlkZW50aWZpZXIgaXMgbm90IGFsbC1jYXBzLCBsZWF2ZSBpdCB1bmNoYW5nZWQgKGV4Y2VwdCwgcG9zc2libHksIGZvciB0aGUgZmlyc3QgbGV0dGVyKQotCSAqICAgICAtIGNvbnZlcnQgdG8gYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIKLQkgKiAgICAgICAgIC0gZWxpbWluYXRlIGlsbGVnYWwgY2hhcmFjdGVycwotCSAqICAgICAgICAgLSBpZiB0aGUgcmVzdWx0IGlzIGEgcmVzZXJ2ZWQgd29yZCwgbW9kaWZ5IGl0IHNsaWdodGx5Ci0JICogSWYgdGhlIHJlc3VsdCBpcyBhbHJlYWR5IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGV4aXN0aW5nIGlkZW50aWZpZXJzCi0JICogKGlnbm9yaW5nIGNhc2Ugc28gd2UgZG9uJ3QgaGF2ZSBmaWxlbmFtZSBjb2xsaXNpb25zIG9uIFdpbmRvd3MpLAotCSAqIG1vZGlmeSBpdCBzbGlnaHRseSBhZ2Fpbi4KLQkgKiAgICAgIkZPTyIgPT4gIkZvbyIgb3IgImZvbyIKLQkgKiAgICAgIkZPT19CQVIiID0+ICJGb29CYXIiIG9yICJmb29CYXIiCi0JICogICAgICJQQUNLQUdFIiA9PiAiUGFja2FnZSIgb3IgInBhY2thZ2VfIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gaWRlbnRpZmllcnMpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGlkZW50aWZpZXI7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShyZXN1bHQpIHx8IFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHJlc3VsdCkpIHsKLQkJCS8vIGxlYXZlIG1peGVkIGNhc2UgaWRlbnRpZmllcnMgYWxvbmU/Ci0JCQlyZXN1bHQgPSBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShyZXN1bHQsIGNhcGl0YWxpemVGaXJzdExldHRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBTdHJpbmdUb29scy5jYXBpdGFsaXplKHJlc3VsdCkgOiBTdHJpbmdUb29scy51bmNhcGl0YWxpemUocmVzdWx0KTsKLQkJfQotCQlyZXN1bHQgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIocmVzdWx0KTsKLQkJLy8gYXNzdW1lIHRoYXQgY29udmVydGluZyB0byBhIHVuaXF1ZSBuYW1lIHdpbGwgbm90IHJlc3VsdCBpbiBhIEphdmEgcmVzZXJ2ZWQgd29yZAotCQkvLyAoc2luY2Ugbm8gSmF2YSByZXNlcnZlZCB3b3JkcyBlbmQgd2l0aCBhIG51bWJlcikKLQkJcmVzdWx0ID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKHJlc3VsdCwgaWRlbnRpZmllcnMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRW50aXR5R2VuVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvRW50aXR5R2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9FbnRpdHlHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllZDNlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9FbnRpdHlHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8vIFRPRE8gZm9ybWF0IGdlbmVyYXRlZCBjb2RlIHBlciBwcmVmZXJlbmNlcwotLy8gVE9ETyBvcmdhbml6ZSBnZW5lcmF0ZWQgaW1wb3J0cyBwZXIgcHJlZmVyZW5jZXMKLS8qKgotICogVGhpcyBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhbiBlbnRpdHkgZm9yIGEgdGFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5lcmF0b3IgewotCWZpbmFsIENvbmZpZyBjb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudDsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIGdlblRhYmxlOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVudGl0eUNsYXNzTmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwa0NsYXNzTmFtZTsKLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCXN0YXRpYyB2b2lkIGdlbmVyYXRlRW50aXR5KAotCQkJQ29uZmlnIGNvbmZpZywKLQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LAotCQkJR2VuVGFibGUgZ2VuVGFibGUsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcgotCSkgewotCQlpZiAoKGNvbmZpZyA9PSBudWxsKSB8fCAocGFja2FnZUZyYWdtZW50ID09IG51bGwpIHx8IChnZW5UYWJsZSA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IEVudGl0eUdlbmVyYXRvcihjb25maWcsIHBhY2thZ2VGcmFnbWVudCwgZ2VuVGFibGUpLmdlbmVyYXRlRW50aXR5KHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yKENvbmZpZyBjb25maWcsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBHZW5UYWJsZSBnZW5UYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnQ7Ci0JCXRoaXMuZ2VuVGFibGUgPSBnZW5UYWJsZTsKLQkJdGhpcy5lbnRpdHlDbGFzc05hbWUgPSB0aGlzLmZ1bGx5UXVhbGlmeSh0aGlzLmdldEVudGl0eU5hbWUoKSk7Ci0JCXRoaXMucGtDbGFzc05hbWUgPSB0aGlzLmVudGl0eUNsYXNzTmFtZSArICcuJyArIGNvbmZpZy5nZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvZGUgZ2VuICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0eShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0cnkgewotCQkJdGhpcy5nZW5lcmF0ZUVudGl0eV8ocHJvZ3Jlc3NNb25pdG9yKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdHlfKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChwcm9ncmVzc01vbml0b3IsIHRoaXMuYnVpbGRUYXNrTmFtZSgpLCAxMDApOwotCQlTdHJpbmcgZmlsZU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUoKSArICIuamF2YSI7ICAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmJ1aWxkU291cmNlKCk7Ci0JCXNtLndvcmtlZCgyMCk7Ci0JCXRyeSB7Ci0JCQl0aGlzLnBhY2thZ2VGcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoZmlsZU5hbWUsIHNvdXJjZSwgZmFsc2UsIHNtLm5ld0NoaWxkKDQwKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldEphdmFNb2RlbFN0YXR1cygpLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKSB7Ci0JCQkJaWYgKHRoaXMuY29uZmlnLmdldE92ZXJ3cml0ZUNvbmZpcm1lcigpLm92ZXJ3cml0ZSh0aGlzLmVudGl0eUNsYXNzTmFtZSkpIHsKLQkJCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCBzb3VyY2UsIHRydWUsIHNtLm5ld0NoaWxkKDQwKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQlzbS5zZXRXb3JrUmVtYWluaW5nKDApOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFza05hbWUoKSB7Ci0JCXJldHVybiBOTFMuYmluZChKcHRHZW5NZXNzYWdlcy5FbnRpdHlHZW5lcmF0b3JfdGFza05hbWUsIHRoaXMuZ2V0RW50aXR5TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgImJvZHkiIHNvdXJjZSBmaXJzdDsgdGhlbiBidWlsZCB0aGUgInBhY2thZ2UiIGFuZCAiaW1wb3J0cyIgc291cmNlCi0JICogYW5kIGNvbmNhdGVuYXRlIHRoZSAiYm9keSIgc291cmNlIHRvIGl0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTb3VyY2UoKSB7Ci0JCS8vIGJ1aWxkIHRoZSBib2R5IHNvdXJjZSBmaXJzdCBzbyB3ZSBjYW4gZ2F0aGVyIHVwIHRoZSBpbXBvcnQgc3RhdGVtZW50cwotCQlCb2R5U291cmNlIGJvZHlTb3VyY2UgPSB0aGlzLmJ1aWxkQm9keVNvdXJjZSgpOwotCi0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoYm9keVNvdXJjZS5sZW5ndGgoKSArIDIwMDApOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRoaXMucHJpbnRQYWNrYWdlQW5kSW1wb3J0c09uKHB3LCBib2R5U291cmNlKTsKLQkJcHcucHJpbnQoYm9keVNvdXJjZS5nZXRTb3VyY2UoKSk7Ci0JCXJldHVybiBzdy50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgQm9keVNvdXJjZSBidWlsZEJvZHlTb3VyY2UoKSB7Ci0JCUVudGl0eVNvdXJjZVdyaXRlciBwdyA9IG5ldyBFbnRpdHlTb3VyY2VXcml0ZXIodGhpcy5nZXRQYWNrYWdlTmFtZSgpLCB0aGlzLmVudGl0eUNsYXNzTmFtZSk7Ci0JCXRoaXMucHJpbnRCb2R5U291cmNlT24ocHcpOwotCQlyZXR1cm4gcHc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Qm9keVNvdXJjZU9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKHB3KTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRFbnRpdHlQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50U2VyaWFsVmVyc2lvblVJREZpZWxkT24ocHcpOwotCQkJcHcucHJpbnRsbigpOwotCi0JCQl0aGlzLnByaW50WmVyb0FyZ3VtZW50Q29uc3RydWN0b3JPbih0aGlzLmdldEVudGl0eU5hbWUoKSwgdGhpcy5jb25maWcuZ2V0TWV0aG9kVmlzaWJpbGl0eUNsYXVzZSgpLCBwdyk7Ci0JCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkgfHwgdGhpcy5jb25maWcuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKSB7Ci0JCQkJdGhpcy5wcmludEVudGl0eVByaW1hcnlLZXlQcm9wZXJ0aWVzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNQcm9wZXJ0aWVzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVQcm9wZXJ0aWVzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlPbmVUb01hbnlQcm9wZXJ0aWVzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlQcm9wZXJ0aWVzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlQcm9wZXJ0aWVzT24ocHcpOwotCQkJfQotCi0JCQlpZiAodGhpcy5wcmltYXJ5S2V5Q2xhc3NJc1JlcXVpcmVkKCkpIHsKLQkJCQl0aGlzLnByaW50UHJpbWFyeUtleUNsYXNzT24ocHcpOwotCQkJfQotCQlwdy51bmRlbnQoKTsKLQotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7ICAvLyBFT0YKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xhc3MgZGVjbGFyYXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50RW50aXR5QW5ub3RhdGlvbk9uKHB3KTsKLQkJdGhpcy5wcmludFRhYmxlQW5ub3RhdGlvbk9uKHB3KTsKLQkJdGhpcy5wcmludElkQ2xhc3NBbm5vdGF0aW9uT24ocHcpOwotCi0JCXB3LnByaW50KCJwdWJsaWMgY2xhc3MgIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuZW50aXR5Q2xhc3NOYW1lKTsKLQkJaWYgKGNvbmZpZy5zZXJpYWxpemFibGUoKSkgewotCQkJcHcucHJpbnQoIiBpbXBsZW1lbnRzICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oU2VyaWFsaXphYmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCX0KLQkJcHcucHJpbnQoIiB7Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFRhYmxlQW5ub3RhdGlvbk9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUodGhpcy5nZXRFbnRpdHlOYW1lKCksIHRoaXMuZ2V0VGFibGUoKSk7Ci0JCWlmICh0YWJsZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gdGhlIGRlZmF1bHQgdGFibGUgbmFtZSBpcyBPSwotCQl9Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlwdy5wcmludCgiKG5hbWU9Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50U3RyaW5nTGl0ZXJhbCh0YWJsZU5hbWUpOwotCQlwdy5wcmludCgnKScpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRDbGFzc0Fubm90YXRpb25PbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMucHJpbWFyeUtleUNsYXNzSXNSZXF1aXJlZCgpICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEsoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCQlwdy5wcmludCgnKCcpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5wa0NsYXNzTmFtZSk7Ci0JCQlwdy5wcmludCgiLmNsYXNzKSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGZpZWxkcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLnByaW1hcnlLZXlDbGFzc0lzUmVxdWlyZWQoKSAmJiB0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlFbWJlZGRlZElkUHJpbWFyeUtleUZpZWxkT24ocHcpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlGaWVsZHNPbihwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlFbWJlZGRlZElkUHJpbWFyeUtleUZpZWxkT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTUJFRERFRF9JRCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJdGhpcy5wcmludEZpZWxkT24odGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yRW1iZWRkZWRJZCgpLCB0aGlzLnBrQ2xhc3NOYW1lLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcmltYXJ5S2V5RmllbGRzT24ocHcsIHRydWUsIHRydWUpOyAgLy8gdHJ1ZT1yZWFkLW9ubHk7IHRydWU9cHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBmaWVsZHMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFByaW1hcnlLZXlGaWVsZHNPbihwdywgZmFsc2UsIHRydWUpOyAgLy8gZmFsc2U9d3JpdGFibGU7IHRydWU9cHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBmaWVsZHMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3LCBib29sZWFuIHJlYWRPbmx5LCBib29sZWFuIHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLnByaW1hcnlLZXlDb2x1bW5zKHJlYWRPbmx5KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50UHJpbWFyeUtleUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcsIHJlYWRPbmx5LCBwcmludElkQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENvbHVtbj4gcHJpbWFyeUtleUNvbHVtbnMoYm9vbGVhbiByZWFkT25seSkgewotCQlyZXR1cm4gcmVhZE9ubHkgPyB0aGlzLmdlblRhYmxlLnJlYWRPbmx5UHJpbWFyeUtleUNvbHVtbnMoKSA6IHRoaXMuZ2VuVGFibGUud3JpdGFibGVQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQotCS8vIFRPRE8gaWYgdGhlIGZpZWxkJ3MgdHlwZSBpcyBqYXZhLnV0aWwvc3FsLkRhdGUsIGl0IG5lZWRzIEBUZW1wb3JhbChEQVRFKQotCS8vIFRPRE8gaWYgdGhlIHByaW1hcnkga2V5IGlzIGF1dG8tZ2VuZXJhdGVkLCB0aGUgZmllbGQgbXVzdCBiZSBhbiBpbnRlZ3JhbCB0eXBlCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUZpZWxkT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3LCBib29sZWFuIHJlYWRPbmx5LCBib29sZWFuIHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmdldEF0dHJpYnV0ZU5hbWVGb3IoY29sdW1uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQlpZiAocHJpbnRJZEFubm90YXRpb24pIHsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLklEKTsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IHRoaXMuY29uZmlnLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShmaWVsZE5hbWUsIGNvbHVtbik7Ci0JCQlpZiAocmVhZE9ubHkpIHsKLQkJCQl0aGlzLnByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uTmFtZSwgcHcpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnByaW50Q29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtbk5hbWUsIHB3KTsKLQkJCX0KLQkJfQotCQl0aGlzLnByaW50RmllbGRPbihmaWVsZE5hbWUsIGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24oU3RyaW5nIGNvbHVtbk5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCXB3LnByaW50KCcoJyk7Ci0JCWlmIChjb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCXB3LnByaW50KCJuYW1lPSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRTdHJpbmdMaXRlcmFsKGNvbHVtbk5hbWUpOwotCQkJcHcucHJpbnQoIiwgIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHcucHJpbnQoImluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSkiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYXNpYyBmaWVsZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSB0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoZmllbGROYW1lLCBjb2x1bW4pOwotCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW5OYW1lLCBwdyk7Ci0JCX0KLQkJaWYgKGNvbHVtbi5pc0xPQigpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkxPQik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJdGhpcy5wcmludEZpZWxkT24oZmllbGROYW1lLCBjb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Q29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBjb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKGNvbHVtbk5hbWUgIT0gbnVsbCkgeyAgLy8gdGhlIGNvbHVtbiBuYW1lIGlzIG51bGwgaWYgdGhlIGRlZmF1bHQgaXMgT0sKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCXB3LnByaW50KCIobmFtZT0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50U3RyaW5nTGl0ZXJhbChjb2x1bW5OYW1lKTsKLQkJCXB3LnByaW50KCcpJyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFueS10by1vbmUgZmllbGRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb09uZVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm1hbnlUb09uZVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUZpZWxkT24oTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQl0aGlzLnByaW50RmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCkpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYW55VG9PbmVSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlwdy5wcmludGxuKCk7Ci0JCUZvcmVpZ25LZXkgZm9yZWlnbktleSA9IHJlbGF0aW9uLmdldEZvcmVpZ25LZXkoKTsKLQkJaWYgKGZvcmVpZ25LZXkucmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKSkgewotCQkJLy8gaWYgdGhlIEZLIHJlZmVyZW5jZXMgYSBzaW5nbGUtY29sdW1uIFBLLCAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGlzIG5vdCByZXF1aXJlZAotCQkJU3RyaW5nIGpvaW5Db2x1bW5OYW1lID0gdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShhdHRyaWJ1dGVOYW1lLCBmb3JlaWduS2V5KTsKLQkJCWlmIChqb2luQ29sdW1uTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy8gbm8gSm9pbkNvbHVtbiBhbm5vdGF0aW9uIG5lZWRlZDogdGhlIGRlZmF1bHQgJ25hbWUnIGFuZCAncmVmZXJlbmNlZENvbHVtbk5hbWUnIHdvcmsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBqb2luIGNvbHVtbiBoZXJlIChqdXN0IG5vdCB0aGUgZGVmYXVsdCBuYW1lKQotCQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGpvaW5Db2x1bW5OYW1lLCBudWxsLCBwdyk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludE1hbnlUb09uZUpvaW5Db2x1bW5zQW5ub3RhdGlvbk9uKGZvcmVpZ25LZXksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE1hbnlUb09uZUpvaW5Db2x1bW5zQW5ub3RhdGlvbk9uKEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpID4gMSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJcHcucHJpbnQoIih7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJfQotCQl0aGlzLnByaW50Sm9pbkNvbHVtbkFubm90YXRpb25zT24oZm9yZWlnbktleSwgcHcpOwotCQlpZiAoZm9yZWlnbktleS5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcucHJpbnQoIn0pIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleS5Db2x1bW5QYWlyPiBzdHJlYW0gPSBmb3JlaWduS2V5LmNvbHVtblBhaXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlwdy5wcmludGxuKCcsJyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKEZvcmVpZ25LZXkuQ29sdW1uUGFpciBjb2x1bW5QYWlyLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uT24oCi0JCQl0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpKSwKLQkJCXRoaXMuY29uZmlnLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkpLAotCQkJcHcKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiAnYmFzZUNvbHVtbk5hbWUnIGNhbm5vdCBiZSBudWxsOwotCSAqICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgaXMgbnVsbCB3aGVuIHRoZSBkZWZhdWx0IGlzIGFwcGxpY2FibGUgKGkuZS4gdGhlCi0JICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZQotCSAqIHJlZmVyZW5jZWQgdGFibGUpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihTdHJpbmcgYmFzZUNvbHVtbk5hbWUsIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQlwdy5wcmludCgiKG5hbWU9Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50U3RyaW5nTGl0ZXJhbChiYXNlQ29sdW1uTmFtZSk7Ci0KLQkJaWYgKHJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCXB3LnByaW50KCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRTdHJpbmdMaXRlcmFsKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCi0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9uZS10by1tYW55IGZpZWxkcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPbmVUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxPbmVUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5vbmVUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55RmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPbmVUb01hbnlGaWVsZE9uKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE9uZVRvTWFueUFubm90YXRpb25PbihyZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uRmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCkpLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50T25lVG9NYW55QW5ub3RhdGlvbk9uKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCXB3LnByaW50KCIobWFwcGVkQnk9XCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnQocmVsYXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCXB3LnByaW50KCJcIikiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvd25lZCBtYW55LXRvLW1hbnkgZmllbGRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gIHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T3duZWRNYW55VG9NYW55RmllbGRPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yT3duZWQocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnRPd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24oZmllbGROYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uRmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldE5vbk93bmluZ0VudGl0eU5hbWUoKSksIHB3KTsKLQl9Ci0KLQkvKioKLQkgKiBvbmx5IHByaW50IHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbiBpZiBvbmUgb3IgbW9yZSBvZiB0aGUKLQkgKiBbZ2VuZXJhdGVkXSBlbGVtZW50cyBpcyBub3QgZGVmYXVsdGVkOgotCSAqICAgICBuYW1lCi0JICogICAgIGpvaW5Db2x1bW5zCi0JICogICAgIGludmVyc2VKb2luQ29sdW1ucwotCSAqIHRodXMgdGhlIG5lZWQgZm9yIHRoZSAncHJpbnRKb2luVGFibGVBbm5vdGF0aW9uJyBmbGFnCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCXB3LnByaW50bG4oKTsKLQkJQm9vbGVhblJlZmVyZW5jZSBwcmludEpvaW5UYWJsZUFubm90YXRpb24gPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQotCQlpZiAoICEgcmVsYXRpb24uam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKSB7ICAvLyBkYi1vbmx5IHRlc3QgLSBubyBuZWVkIHRvIGRlbGVnYXRlIHRvIHBsYXRmb3JtPwotCQkJcHJpbnRKb2luVGFibGVBbm5vdGF0aW9uLnNldEZhbHNlKCk7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJcHcucHJpbnQoIihuYW1lPSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRTdHJpbmdMaXRlcmFsKHRoaXMuY29uZmlnLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShyZWxhdGlvbi5nZXRKb2luR2VuVGFibGUoKS5nZXRUYWJsZSgpKSk7Ci0JCX0KLQotCQl0aGlzLnByaW50Sm9pblRhYmxlSm9pbkNvbHVtbkFubm90YXRpb25zT24oCi0JCQkJImpvaW5Db2x1bW5zIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQlhdHRyaWJ1dGVOYW1lLAotCQkJCXJlbGF0aW9uLmdldE93bmluZ0ZvcmVpZ25LZXkoKSwKLQkJCQlwcmludEpvaW5UYWJsZUFubm90YXRpb24sCi0JCQkJcHcKLQkJKTsKLQotCQl0aGlzLnByaW50Sm9pblRhYmxlSm9pbkNvbHVtbkFubm90YXRpb25zT24oCi0JCQkJImludmVyc2VKb2luQ29sdW1ucyIsICAvLyROT04tTkxTLTEkCi0JCQkJcmVsYXRpb24uZ2V0Tm9uT3duaW5nR2VuVGFibGUoKS5nZXRBdHRyaWJ1dGVOYW1lRm9yTm9uT3duZWQocmVsYXRpb24pLAotCQkJCXJlbGF0aW9uLmdldE5vbk93bmluZ0ZvcmVpZ25LZXkoKSwKLQkJCQlwcmludEpvaW5UYWJsZUFubm90YXRpb24sCi0JCQkJcHcKLQkJKTsKLQotCQlpZiAocHJpbnRKb2luVGFibGVBbm5vdGF0aW9uLmlzRmFsc2UoKSkgewotCQkJcHcucHJpbnQoJyknKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICdlbGVtZW50TmFtZScgaXMgZWl0aGVyICJqb2luQ29sdW1ucyIgb3IgImludmVyc2VKb2luQ29sdW1ucyIKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luVGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXksIEJvb2xlYW5SZWZlcmVuY2UgcHJpbnRKb2luVGFibGVBbm5vdGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJLy8gd2UgaGF2ZSB0byBwcmUtY2FsY3VsYXRlIHdoZXRoZXIgZWl0aGVyICduYW1lJyBhbmQvb3IgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJwotCQkvLyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZXkgYXJlIHdyYXBwZWQgYnkgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uIGFuZCB3ZQotCQkvLyBuZWVkIHRvIHByaW50IHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbiBmaXJzdCAoaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBwcmludGVkKQotCQlib29sZWFuIHByaW50UmVmID0gISBmb3JlaWduS2V5LnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCk7Ci0JCS8vIGlmICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgaXMgcmVxdWlyZWQsICduYW1lJyBpcyBhbHNvIHJlcXVpcmVkIChpLmUuIGl0IGNhbm5vdCBiZSBkZWZhdWx0ZWQpOwotCQkvLyBidXQgd2Ugd2lsbCBjYWxjdWxhdGUgaXQgbGF0ZXIgWzFdLCBzaW5jZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMKLQkJU3RyaW5nIGpvaW5Db2x1bW5OYW1lID0gKHByaW50UmVmKSA/Ci0JCQkJCW51bGwgIC8vICdqb2luQ29sdW1uTmFtZScgaXMgbm90IHVzZWQKLQkJCQk6Ci0JCQkJCXRoaXMuY29uZmlnLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoYXR0cmlidXRlTmFtZSwgZm9yZWlnbktleSk7Ci0JCWJvb2xlYW4gcHJpbnRCYXNlID0gKHByaW50UmVmIHx8IChqb2luQ29sdW1uTmFtZSAhPSBudWxsKSk7Ci0JCWlmIChwcmludEJhc2UgfHwgcHJpbnRSZWYpIHsKLQkJCWlmIChwcmludEpvaW5UYWJsZUFubm90YXRpb24uaXNUcnVlKCkpIHsKLQkJCQlwcmludEpvaW5UYWJsZUFubm90YXRpb24uc2V0RmFsc2UoKTsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCXB3LnByaW50KCcoJyk7Ci0JCQl9IGVsc2UgewotCQkJCXB3LnByaW50KCcsJyk7Ci0JCQl9Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlpZiAocHJpbnRSZWYpIHsKLQkJCQkJLy8gaWYgJ3ByaW50UmVmJyBpcyB0cnVlLCAnam9pbkNvbHVtbk5hbWUnIHdpbGwgYWx3YXlzIGJlICJJR05PUkVEIiAoc28gd2UgaWdub3JlIGl0KQotCQkJCQl0aGlzLnByaW50Sm9pblRhYmxlSm9pbkNvbHVtbkFubm90YXRpb25zT24oZWxlbWVudE5hbWUsIGZvcmVpZ25LZXksIHB3KTsgIC8vIFsxXQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmIHRoZSBGSyByZWZlcmVuY2VzIGEgc2luZ2xlLWNvbHVtbiBQSywgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBpcyBub3QgcmVxdWlyZWQKLQkJCQkJaWYgKHByaW50QmFzZSkgewotCQkJCQkJLy8gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBqb2luIGNvbHVtbiBoZXJlIChqdXN0IG5vdCB0aGUgZGVmYXVsdCBuYW1lKQotCQkJCQkJcHcucHJpbnQoZWxlbWVudE5hbWUpOwotCQkJCQkJcHcucHJpbnQoJz0nKTsKLQkJCQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGpvaW5Db2x1bW5OYW1lLCBudWxsLCBwdyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBubyBKb2luQ29sdW1uIGFubm90YXRpb24gbmVlZGVkOiB0aGUgZGVmYXVsdCAnbmFtZScgYW5kICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgd29yawotCQkJCQl9Ci0JCQkJfQotCQkJcHcudW5kZW50KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAnZWxlbWVudE5hbWUnIGlzIGVpdGhlciAiam9pbkNvbHVtbnMiIG9yICJpbnZlcnNlSm9pbkNvbHVtbnMiCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pblRhYmxlSm9pbkNvbHVtbkFubm90YXRpb25zT24oU3RyaW5nIGVsZW1lbnROYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludChlbGVtZW50TmFtZSk7Ci0JCXB3LnByaW50KCc9Jyk7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpID4gMSkgewotCQkJcHcucHJpbnQoJ3snKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LmluZGVudCgpOwotCQl9Ci0JCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihmb3JlaWduS2V5LCBwdyk7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpID4gMSkgewotCQkJcHcudW5kZW50KCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5wcmludCgnfScpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5vbi1vd25lZCBtYW55LXRvLW1hbnkgZmllbGRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55RmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZE9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmdldEF0dHJpYnV0ZU5hbWVGb3JOb25Pd25lZChyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihyZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uRmllbGRPbihmaWVsZE5hbWUsIHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldE93bmluZ0VudGl0eU5hbWUoKSksIHB3KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlwdy5wcmludCgiKG1hcHBlZEJ5PVwiIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50KHJlbGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlwdy5wcmludCgiXCIpIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRTZXJpYWxWZXJzaW9uVUlERmllbGRPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKSB7Ci0JCQlwdy5wcmludCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKFN0cmluZyBjdG9yTmFtZSwgU3RyaW5nIHZpc2liaWxpdHksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSkgewotCQkJcHcucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJcHcucHJpbnQoY3Rvck5hbWUpOwotCQkJcHcucHJpbnQoIigpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LmluZGVudCgpOwotCQkJCXB3LnByaW50bG4oInN1cGVyKCk7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q2xhc3NJc1JlcXVpcmVkKCkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlQcm9wZXJ0eU9uKHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlQcm9wZXJ0aWVzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleVByb3BlcnRpZXNPbihwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlFbWJlZGRlZElkUHJpbWFyeUtleVByb3BlcnR5T24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTUJFRERFRF9JRCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJdGhpcy5wcmludFByb3BlcnR5T24odGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yRW1iZWRkZWRJZCgpLCB0aGlzLnBrQ2xhc3NOYW1lLCBwdyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleVByb3BlcnRpZXNPbihwdywgdHJ1ZSwgdHJ1ZSk7ICAvLyB0cnVlPXJlYWQtb25seTsgdHJ1ZT1wcmludCBJRCBhbm5vdGF0aW9uIG9uIGdldHRlcnMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcmltYXJ5S2V5UHJvcGVydGllc09uKHB3LCBmYWxzZSwgdHJ1ZSk7ICAvLyBmYWxzZT13cml0YWJsZTsgdHJ1ZT1wcmludCBJRCBhbm5vdGF0aW9uIG9uIGdldHRlcnMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiByZWFkT25seSwgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyhyZWFkT25seSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludFByaW1hcnlLZXlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3LCByZWFkT25seSwgcHJpbnRJZEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLy8gVE9ETyBpZiB0aGUgcHJvcGVydHkncyB0eXBlIGlzIGphdmEudXRpbC9zcWwuRGF0ZSwgaXQgbmVlZHMgQFRlbXBvcmFsKERBVEUpCi0JLy8gVE9ETyBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgYXV0by1nZW5lcmF0ZWQsIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5UHJvcGVydHlPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcsIGJvb2xlYW4gcmVhZE9ubHksIGJvb2xlYW4gcHJpbnRJZEFubm90YXRpb24pIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCWlmIChwcmludElkQW5ub3RhdGlvbikgewotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gdGhpcy5jb25maWcuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKHByb3BlcnR5TmFtZSwgY29sdW1uKTsKLQkJCWlmIChyZWFkT25seSkgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihjb2x1bW5OYW1lLCBwdyk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uTmFtZSwgcHcpOwotCQkJfQotCQl9Ci0JCXRoaXMucHJpbnRQcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCksIHB3KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmFzaWMgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljUHJvcGVydHlPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNQcm9wZXJ0eU9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSB0aGlzLmNvbmZpZy5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUocHJvcGVydHlOYW1lLCBjb2x1bW4pOwotCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW5OYW1lLCBwdyk7Ci0JCX0KLQkJdGhpcy5wcmludFByb3BlcnR5T24ocHJvcGVydHlOYW1lLCBjb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hbnktdG8tb25lIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5TWFueVRvT25lUHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb09uZVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm1hbnlUb09uZVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZVByb3BlcnR5T24oTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKHByb3BlcnR5TmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlTdHJpbmcgdHlwZURlY2xhcmF0aW9uID0gdGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24uZ2V0UmVmZXJlbmNlZEVudGl0eU5hbWUoKSk7Ci0JCXRoaXMucHJpbnRQcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgdHlwZURlY2xhcmF0aW9uLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9uZS10by1tYW55IHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55UHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE9uZVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm9uZVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPbmVUb01hbnlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU9uZVRvTWFueVByb3BlcnR5T24oT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T25lVG9NYW55QW5ub3RhdGlvbk9uKHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5nZXRSZWZlcmVuY2VkRW50aXR5TmFtZSgpKTsKLQkJdGhpcy5wcmludENvbGxlY3Rpb25Qcm9wZXJ0eU9uKHByb3BlcnR5TmFtZSwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgcHcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvd25lZCBtYW55LXRvLW1hbnkgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlQcm9wZXJ0aWVzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlQcm9wZXJ0eU9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueVByb3BlcnR5T24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvck93bmVkKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKHByb3BlcnR5TmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldE5vbk93bmluZ0VudGl0eU5hbWUoKSk7Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uUHJvcGVydHlPbihwcm9wZXJ0eU5hbWUsIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHB3KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbm9uLW93bmVkIG1hbnktdG8tbWFueSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueVByb3BlcnRpZXNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueVByb3BlcnR5T24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55UHJvcGVydHlPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yTm9uT3duZWQocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24ocmVsYXRpb24sIHB3KTsKLQkJfQotCQlTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLmdldE93bmluZ0VudGl0eU5hbWUoKSk7Ci0JCXRoaXMucHJpbnRDb2xsZWN0aW9uUHJvcGVydHlPbihwcm9wZXJ0eU5hbWUsIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHB3KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcG91bmQgcHJpbWFyeSBrZXkgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUNsYXNzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50bG4oKTsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludCgicHVibGljIHN0YXRpYyBjbGFzcyAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnQodGhpcy5jb25maWcuZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpKTsKLQkJcHcucHJpbnQoIiBpbXBsZW1lbnRzICIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiB7Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCQl0aGlzLnByaW50RW1iZWRkYWJsZVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW1iZWRkYWJsZVdyaXRhYmxlUHJpbWFyeUtleUZpZWxkc09uKHB3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5wcmludElkRmllbGRzT24ocHcpOwotCQkJfQotCQkJdGhpcy5wcmludFNlcmlhbFZlcnNpb25VSURGaWVsZE9uKHB3KTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKHRoaXMuY29uZmlnLmdldFByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWUoKSwgInB1YmxpYyIsIHB3KTsgIC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpIHx8IHRoaXMuY29uZmlnLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoKSkgewotCQkJCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCQkJdGhpcy5wcmludEVtYmVkZGFibGVSZWFkT25seVByaW1hcnlLZXlQcm9wZXJ0aWVzT24ocHcpOwotCQkJCQl0aGlzLnByaW50RW1iZWRkYWJsZVdyaXRhYmxlUHJpbWFyeUtleVByb3BlcnRpZXNPbihwdyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5wcmludElkUHJvcGVydGllc09uKHB3KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5RXF1YWxzTWV0aG9kT24odGhpcy5jb25maWcuZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpLCB0aGlzLmdldFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKSwgcHcpOwotCQkJdGhpcy5wcmludFByaW1hcnlLZXlIYXNoQ29kZU1ldGhvZE9uKHRoaXMuZ2V0VGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpLCBwdyk7Ci0JCXB3LnVuZGVudCgpOwotCi0JCXB3LnByaW50KCd9Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wb3VuZCBwcmltYXJ5IGtleSBjbGFzcyBmaWVsZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW1iZWRkYWJsZVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleUZpZWxkc09uKHB3LCB0cnVlLCBmYWxzZSk7ICAvLyB0cnVlPXJlYWQtb25seTsgZmFsc2U9ZG8gbm90IHByaW50IElEIGFubm90YXRpb24gb24gZmllbGRzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW1iZWRkYWJsZVdyaXRhYmxlUHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UHJpbWFyeUtleUZpZWxkc09uKHB3LCBmYWxzZSwgZmFsc2UpOyAgLy8gZmFsc2U9d3JpdGFibGU7IGZhbHNlPWRvIG5vdCBwcmludCBJRCBhbm5vdGF0aW9uIG9uIGZpZWxkcwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkRmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdldFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50SWRGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkRmllbGRPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludEZpZWxkT24odGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbiksIGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpLCBwdyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBvdW5kIHByaW1hcnkga2V5IGNsYXNzIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW1iZWRkYWJsZVJlYWRPbmx5UHJpbWFyeUtleVByb3BlcnRpZXNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFByaW1hcnlLZXlQcm9wZXJ0aWVzT24ocHcsIHRydWUsIGZhbHNlKTsgIC8vIHRydWU9cmVhZC1vbmx5OyBmYWxzZT1kbyBub3QgcHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBnZXR0ZXJzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW1iZWRkYWJsZVdyaXRhYmxlUHJpbWFyeUtleVByb3BlcnRpZXNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFByaW1hcnlLZXlQcm9wZXJ0aWVzT24ocHcsIGZhbHNlLCBmYWxzZSk7ICAvLyBmYWxzZT13cml0YWJsZTsgZmFsc2U9ZG8gbm90IHByaW50IElEIGFubm90YXRpb24gb24gZ2V0dGVycwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkUHJvcGVydGllc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZXRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludElkUHJvcGVydHlPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZFByb3BlcnR5T24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRQcm9wZXJ0eU9uKHRoaXMuZ2VuVGFibGUuZ2V0QXR0cmlidXRlTmFtZUZvcihjb2x1bW4pLCBjb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKSwgcHcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wb3VuZCBwcmltYXJ5IGtleSBjbGFzcyBlcXVhbHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUVxdWFsc01ldGhvZE9uKFN0cmluZyBjbGFzc05hbWUsIEl0ZXJhdG9yPENvbHVtbj4gY29sdW1ucywgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbigiamF2YS5sYW5nLk92ZXJyaWRlIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5wcmludGxuKCJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludGxuKCJpZiAobyA9PSB0aGlzKSB7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gdHJ1ZTsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnQoJ30nKTsKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJcHcucHJpbnQoImlmICggISAobyBpbnN0YW5jZW9mICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpKSB7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gZmFsc2U7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KGNsYXNzTmFtZSk7Ci0JCQlwdy5wcmludCgiIG90aGVyID0gKCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpIG87Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KCJyZXR1cm4gIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5pbmRlbnQoKTsKLQkJCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQkJdGhpcy5wcmludFByaW1hcnlLZXlFcXVhbHNDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgcHcpOwotCQkJCQlpZiAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCXB3LnByaW50bG4oKTsKLQkJCQkJCXB3LnByaW50KCImJiAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQlwdy5wcmludCgnOycpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnVuZGVudCgpOwotCQlwdy51bmRlbnQoKTsKLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5nZXRBdHRyaWJ1dGVOYW1lRm9yKGNvbHVtbik7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZSgpOwotCQlpZiAoamF2YVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJdGhpcy5wcmludFByaW1pdGl2ZUVxdWFsc0NsYXVzZU9uKGZpZWxkTmFtZSwgcHcpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKGZpZWxkTmFtZSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCIodGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIiA9PSBvdGhlci4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoJyknKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRSZWZlcmVuY2VFcXVhbHNDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCIuZXF1YWxzKG90aGVyLiIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnKScpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wb3VuZCBwcmltYXJ5IGtleSBjbGFzcyBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlTWV0aG9kT24oSXRlcmF0b3I8Q29sdW1uPiBjb2x1bW5zLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKCJqYXZhLmxhbmcuT3ZlcnJpZGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcHcucHJpbnRsbigpOwotCi0JCXB3LnByaW50bG4oInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Iik7ICAvLyROT04tTkxTLTEkCi0JCXB3LmluZGVudCgpOwotCQkJcHcucHJpbnRsbigiZmluYWwgaW50IHByaW1lID0gMzE7Iik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludGxuKCJpbnQgaGFzaCA9IDE3OyIpOyAgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoImhhc2ggPSBoYXNoICogcHJpbWUgKyAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oY29sdW1ucy5uZXh0KCksIHB3KTsKLQkJCQlwdy5wcmludCgnOycpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCXB3LnByaW50bG4oInJldHVybiBoYXNoOyIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy51bmRlbnQoKTsKLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmdldEF0dHJpYnV0ZU5hbWVGb3IoY29sdW1uKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSwgZmllbGROYW1lLCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihmaWVsZE5hbWUsIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFByaW1pdGl2ZUhhc2hDb2RlQ2xhdXNlT24oU3RyaW5nIHByaW1pdGl2ZU5hbWUsIFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImludCIpKSB7ICAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGlzLnZhbHVlCi0JCQlwdy5wcmludCgidGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoInNob3J0IikgIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiYnl0ZSIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgcHJpbWl0aXZlTmFtZS5lcXVhbHMoImNoYXIiKSkgeyAgLy8kTk9OLU5MUy0xJAotCQkJLy8gKChpbnQpIHRoaXMudmFsdWUpICAtIGV4cGxpY2l0IGNhc3QKLQkJCXB3LnByaW50KCIoKGludCkgdGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCQlwdy5wcmludCgnKScpOwotCQl9IGVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJsb25nIikpIHsgIC8vIGNyaWJiZWQgZnJvbSBMb25nI2hhc2hDb2RlKCkgIC8vJE5PTi1OTFMtMSQKLQkJCS8vICgoaW50KSAodGhpcy52YWx1ZSBeICh0aGlzLnZhbHVlID4+PiAzMikpKQotCQkJcHcucHJpbnQoIigoaW50KSAodGhpcy4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCQlwdy5wcmludCgiIF4gKHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIiA+Pj4gMzIpKSkiKTsgIC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiZmxvYXQiKSkgeyAgLy8gY3JpYmJlZCBmcm9tIEZsb2F0I2hhc2hDb2RlKCkgIC8vJE5PTi1OTFMtMSQKLQkJCS8vIGphdmEubGFuZy5GbG9hdC5mbG9hdFRvSW50Qml0cyh0aGlzLnZhbHVlKQotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5GbG9hdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoIi5mbG9hdFRvSW50Qml0cyh0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCcpJyk7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImRvdWJsZSIpKSB7ICAvLyBjcmliYmVkIGZyb20gRG91YmxlI2hhc2hDb2RlKCkgIC8vJE5PTi1OTFMtMSQKLQkJCS8vCSgoaW50KSAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpIF4gKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSA+Pj4gMzIpKSkKLQkJCXB3LnByaW50KCIoKGludCkgKCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5Eb3VibGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIpIF4gKCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5Eb3VibGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIpID4+PiAzMikpKSIpOyAgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsgIC8vJE5PTi1OTFMtMSQKLQkJCS8vICh0aGlzLnZhbHVlID8gMSA6IDApCi0JCQlwdy5wcmludCgiKHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIiA/IDEgOiAwKSIpOyAgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwcmltaXRpdmVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJ0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgiLmhhc2hDb2RlKCkiKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGFja2FnZSBhbmQgaW1wb3J0cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcHJpbnRQYWNrYWdlQW5kSW1wb3J0c09uKFByaW50V3JpdGVyIHB3LCBCb2R5U291cmNlIGJvZHlTb3VyY2UpIHsKLQkJaWYgKHRoaXMuZ2V0UGFja2FnZU5hbWUoKS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlwdy5wcmludCgicGFja2FnZSAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXB3LnByaW50KHRoaXMuZ2V0UGFja2FnZU5hbWUoKSk7Ci0JCQlwdy5wcmludCgnOycpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBzdHJlYW0gPSBib2R5U291cmNlLmltcG9ydEVudHJpZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gc3RyZWFtLm5leHQoKTsKLQkJCXB3LnByaW50KCJpbXBvcnQgIik7ICAvLyROT04tTkxTLTEkCi0JCQlwdy5wcmludChlbnRyeS5nZXRWYWx1ZSgpKTsgIC8vIHBhY2thZ2UKLQkJCXB3LnByaW50KCcuJyk7Ci0JCQlwdy5wcmludChlbnRyeS5nZXRLZXkoKSk7ICAvLyBzaG9ydCBjbGFzcyBuYW1lCi0JCQlwdy5wcmludCgnOycpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmllbGRzICoqKioqKioqKioKLQotCS8qKgotCSAqIHZpc2liaWxpdHkgaXMgc2V0IGluIHRoZSBjb25maWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRGaWVsZE9uKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEZpZWxkKAotCQkJCWZpZWxkTmFtZSwKLQkJCQl0eXBlRGVjbGFyYXRpb24sCi0JCQkJdGhpcy5jb25maWcuZ2V0RmllbGRWaXNpYmlsaXR5Q2xhdXNlKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiB2aXNpYmlsaXR5IGFuZCBjb2xsZWN0aW9uIHR5cGUgYXJlIHNldCBpbiB0aGUgY29uZmlnCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50Q29sbGVjdGlvbkZpZWxkT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludFBhcmFtZXRlcml6ZWRGaWVsZCgKLQkJCQlmaWVsZE5hbWUsCi0JCQkJdGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCksCi0JCQkJZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwKLQkJCQl0aGlzLmNvbmZpZy5nZXRGaWVsZFZpc2liaWxpdHlDbGF1c2UoKQotCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIHZpc2liaWxpdHkgaXMgc2V0IGluIHRoZSBjb25maWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRQcm9wZXJ0eU9uKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEdldHRlckFuZFNldHRlcigKLQkJCQlwcm9wZXJ0eU5hbWUsCi0JCQkJdHlwZURlY2xhcmF0aW9uLAotCQkJCXRoaXMuY29uZmlnLmdldE1ldGhvZFZpc2liaWxpdHlDbGF1c2UoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIHZpc2liaWxpdHkgYW5kIGNvbGxlY3Rpb24gdHlwZSBhcmUgc2V0IGluIHRoZSBjb25maWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRDb2xsZWN0aW9uUHJvcGVydHlPbihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50Q29sbGVjdGlvbkdldHRlckFuZFNldHRlcigKLQkJCQlwcm9wZXJ0eU5hbWUsCi0JCQkJdGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCksCi0JCQkJZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwKLQkJCQl0aGlzLmNvbmZpZy5nZXRNZXRob2RWaXNpYmlsaXR5Q2xhdXNlKCkKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuVGFibGUuZ2V0VGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZS5nZXRFbnRpdHlOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByaW1hcnlLZXlDbGFzc0lzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPiAxOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmeShTdHJpbmcgc2hvcnRDbGFzc05hbWUpIHsKLQkJU3RyaW5nIHBrZyA9IHRoaXMuZ2V0UGFja2FnZU5hbWUoKTsKLQkJcmV0dXJuIChwa2cubGVuZ3RoKCkgPT0gMCkgPyBzaG9ydENsYXNzTmFtZSA6IHBrZyArICcuJyArIHNob3J0Q2xhc3NOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2VuVGFibGUuZ2V0TmFtZSgpICsgIiA9PiAiICsgdGhpcy5lbnRpdHlDbGFzc05hbWUpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3VyY2Ugd3JpdGVyICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIEJvZHlTb3VyY2UgewotCi0JCS8qKgotCQkgKiByZXR1cm4gYSBzb3J0ZWQgc2V0IG9mIG1hcCBlbnRyaWVzOyB0aGUga2V5IGlzIHRoZSBzaG9ydCBjbGFzcyBuYW1lLAotCQkgKiB0aGUgdmFsdWUgaXMgdGhlIHBhY2thZ2UgbmFtZQotCQkgKi8KLQkJSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gaW1wb3J0RW50cmllcygpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGJvZHkgc291cmNlIGNvZGUKLQkJICovCi0JCVN0cmluZyBnZXRTb3VyY2UoKTsKLQotCQkvKioKLQkJICogcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkgc291cmNlIGNvZGUKLQkJICovCi0JCWludCBsZW5ndGgoKTsKLQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCBJbmRlbnRpbmdQcmludFdyaXRlciB3aXRoIHNvbWUgbWV0aG9kcyB0aGF0IGZhY2lsaXRhdGUgYnVpbGRpbmcKLQkgKiBjbGFzcyBzb3VyY2UgY29kZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlTb3VyY2VXcml0ZXIgZXh0ZW5kcyBJbmRlbnRpbmdQcmludFdyaXRlciBpbXBsZW1lbnRzIEJvZHlTb3VyY2UgewotCQlmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWU7Ci0JCS8vIGtleSA9IHNob3J0IGNsYXNzIG5hbWU7IHZhbHVlID0gcGFja2FnZSBuYW1lCi0JCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJRW50aXR5U291cmNlV3JpdGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJc3VwZXIobmV3IFN0cmluZ1dyaXRlcigyMDAwMCkpOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIFN0cmluZyBMaXRlcmFsIGFuZCBwcmludCBpdCwKLQkJICogYWRkaW5nIHRoZSBzdXJyb3VuZGluZyBkb3VibGUtcXVvdGVzIGFuZCBlc2NhcGluZyBjaGFyYWN0ZXJzCi0JCSAqIGFzIG5lY2Vzc2FyeS4KLQkJICovCi0JCXZvaWQgcHJpbnRTdHJpbmdMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKLQkJCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oc3RyaW5nLCB0aGlzKTsKLQkJfQotCi0JCXZvaWQgcHJpbnRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5TW9kaWZpZXIpIHsKLQkJCWlmICh2aXNpYmlsaXR5TW9kaWZpZXIubGVuZ3RoKCkgIT0gMCkgewotCQkJCXRoaXMucHJpbnQodmlzaWJpbGl0eU1vZGlmaWVyKTsKLQkJCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHByaW50QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJCXRoaXMucHJpbnQoJ0AnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0KLQkJdm9pZCBwcmludFR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLnByaW50KHRoaXMuYnVpbGRJbXBvcnRlZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzICJpbXBvcnRlZCIgbmFtZS4KLQkJICogVGhlIGNsYXNzIGRlY2xhcmF0aW9uIG11c3QgYmUgb2YgdGhlIGZvcm06Ci0JCSAqICAgICAiaW50IgotCQkgKiAgICAgImludFtdIiAobm90ICJbSSIpCi0JCSAqICAgICAiamF2YS5sYW5nLk9iamVjdCIKLQkJICogICAgICJqYXZhLmxhbmcuT2JqZWN0W10iIChub3QgIltMamF2YS5sYW5nLk9iamVjdDsiKQotCQkgKiAgICAgImphdmEudXRpbC5NYXAuRW50cnkiIChub3QgImphdmEudXRpbC5NYXAkRW50cnkiKQotCQkgKiAgICAgImphdmEudXRpbC5NYXAuRW50cnlbXVtdIiAobm90ICJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIpCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBidWlsZEltcG9ydGVkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCWlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3ModHlwZURlY2xhcmF0aW9uKSkgewotCQkJCS8vIG5vIG5lZWQgZm9yIGFuIGltcG9ydCwganVzdCByZXR1cm4gdGhlIHBhcnRpYWxseS1xdWFsaWZpZWQgbmFtZQotCQkJCXJldHVybiB0aGlzLmJ1aWxkTWVtYmVyQ2xhc3NUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCX0KLQkJCWludCBsYXN0ID0gdHlwZURlY2xhcmF0aW9uLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlTdHJpbmcgcGtnID0gKGxhc3QgPT0gLTEpID8gIiIgOiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIGxhc3QpOyAgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHNob3J0VHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZyhsYXN0ICsgMSk7Ci0JCQlTdHJpbmcgc2hvcnRFbGVtZW50VHlwZU5hbWUgPSBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJCXdoaWxlIChzaG9ydEVsZW1lbnRUeXBlTmFtZS5lbmRzV2l0aCgiW10iKSkgeyAgLy8kTk9OLU5MUy0xJAotCQkJCXNob3J0RWxlbWVudFR5cGVOYW1lID0gc2hvcnRFbGVtZW50VHlwZU5hbWUuc3Vic3RyaW5nKDAsIHNob3J0RWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIC0gMik7Ci0JCQl9Ci0JCQlTdHJpbmcgcHJldiA9IHRoaXMuaW1wb3J0cy5nZXQoc2hvcnRFbGVtZW50VHlwZU5hbWUpOwotCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgaXMgdGhlIGZpcnN0IGNsYXNzIHdpdGggdGhpcyBzaG9ydCBlbGVtZW50IHR5cGUgbmFtZQotCQkJCXRoaXMuaW1wb3J0cy5wdXQoc2hvcnRFbGVtZW50VHlwZU5hbWUsIHBrZyk7Ci0JCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQkJfQotCQkJaWYgKHByZXYuZXF1YWxzKHBrZykpIHsKLQkJCQkvLyB0aGlzIGVsZW1lbnQgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGltcG9ydGVkCi0JCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQkJfQotCQkJLy8gYW5vdGhlciBjbGFzcyB3aXRoIHRoZSBzYW1lIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lIGhhcyBiZWVuCi0JCQkvLyBwcmV2aW91c2x5IGltcG9ydGVkLCBzbyB0aGlzIG9uZSBtdXN0IGJlIHVzZWQgZnVsbHktcXVhbGlmaWVkCi0JCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGUuZy4gImZvby5iYXIuRW1wbG95ZWUuUEsiIHdpbGwgcmV0dXJuIHRydWUKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiB0eXBlRGVjbGFyYXRpb25Jc01lbWJlckNsYXNzKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiAodHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpID4gdGhpcy5jbGFzc05hbWUubGVuZ3RoKCkpCi0JCQkJCSYmIHR5cGVEZWNsYXJhdGlvbi5zdGFydHNXaXRoKHRoaXMuY2xhc3NOYW1lKQotCQkJCQkmJiAodHlwZURlY2xhcmF0aW9uLmNoYXJBdCh0aGlzLmNsYXNzTmFtZS5sZW5ndGgoKSkgPT0gJy4nKTsKLQkJfQotCi0JCS8qKgotCQkgKiBlLmcuICJmb28uYmFyLkVtcGxveWVlLlBLIiB3aWxsIHJldHVybiAiRW1wbG95ZWUuUEsiCi0JCSAqIHRoaXMgcHJldmVudHMgY29sbGlzaW9ucyB3aXRoIG90aGVyIGltcG9ydGVkIGNsYXNzZXMgKGUuZy4gImpvby5qYXIuUEsiKQotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgYnVpbGRNZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnBhY2thZ2VOYW1lLmxlbmd0aCgpOwotCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQlpbmRleCsrOyAgLy8gYnVtcCBwYXN0IHRoZSAnLicKLQkJCX0KLQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGluZGV4KTsKLQkJfQotCi0JCXByaXZhdGUgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc29ydGVkSW1wb3J0RW50cmllcygpIHsKLQkJCVRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc29ydGVkSW1wb3J0cyA9IG5ldyBUcmVlU2V0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KHRoaXMuYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpKTsKLQkJCXNvcnRlZEltcG9ydHMuYWRkQWxsKHRoaXMuaW1wb3J0cy5lbnRyeVNldCgpKTsKLQkJCXJldHVybiBzb3J0ZWRJbXBvcnRzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwcml2YXRlIENvbXBhcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlMSwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlMikgewotCQkJCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQkJCWludCBwa2cgPSBjb2xsYXRvci5jb21wYXJlKGUxLmdldFZhbHVlKCksIGUyLmdldFZhbHVlKCkpOwotCQkJCQlyZXR1cm4gKHBrZyA9PSAwKSA/IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0S2V5KCksIGUyLmdldEtleSgpKSA6IHBrZzsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBwcmludEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCXRoaXMucHJpbnQoZmllbGROYW1lKTsKLQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCX0KLQotCQl2b2lkIHByaW50UGFyYW1ldGVyaXplZEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyBwYXJhbWV0ZXJUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJzwnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24ocGFyYW1ldGVyVHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJz4nKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCXRoaXMucHJpbnQoZmllbGROYW1lKTsKLQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCX0KLQotCQl2b2lkIHByaW50R2V0dGVyQW5kU2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50R2V0dGVyKHByb3BlcnR5TmFtZSwgdHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRTZXR0ZXIocHJvcGVydHlOYW1lLCB0eXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludEdldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl0aGlzLnByaW50KHR5cGVEZWNsYXJhdGlvbi5lcXVhbHMoImJvb2xlYW4iKSA/ICJpcyIgOiAiZ2V0Iik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgiKCkgeyIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMuaW5kZW50KCk7Ci0JCQkJdGhpcy5wcmludCgicmV0dXJuIHRoaXMuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMudW5kZW50KCk7Ci0KLQkJCXRoaXMucHJpbnQoJ30nKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludFNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50KCJ2b2lkIHNldCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgnKCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJdGhpcy5wcmludCgiKSB7Iik7ICAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJ0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCIgPSAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQkJdm9pZCBwcmludENvbGxlY3Rpb25HZXR0ZXJBbmRTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludENvbGxlY3Rpb25HZXR0ZXIocHJvcGVydHlOYW1lLCBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRDb2xsZWN0aW9uU2V0dGVyKHByb3BlcnR5TmFtZSwgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgdmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50Q29sbGVjdGlvbkdldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCc8Jyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgiPiBnZXQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucHJpbnQoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpKTsKLQkJCXRoaXMucHJpbnQoIigpIHsiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInJldHVybiB0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJpbnRDb2xsZWN0aW9uU2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludCgidm9pZCBzZXQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucHJpbnQoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpKTsKLQkJCXRoaXMucHJpbnQoJygnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCc8Jyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnPicpOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJdGhpcy5wcmludCgiKSB7Iik7ICAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJ0aGlzLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCIgPSAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIEJvZHlTb3VyY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRFbnRyaWVzKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+LCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+Pih0aGlzLnNvcnRlZEltcG9ydEVudHJpZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IG5leHQpIHsKLQkJCQkJU3RyaW5nIHBrZyA9IG5leHQuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHBrZy5lcXVhbHMoIiIpICAvLyROT04tTkxTLTEkCi0JCQkJCQkJfHwgcGtnLmVxdWFscygiamF2YS5sYW5nIikgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl8fCBwa2cuZXF1YWxzKEVudGl0eVNvdXJjZVdyaXRlci50aGlzLnBhY2thZ2VOYW1lKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiB0aGlzLm91dC50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIGludCBsZW5ndGgoKSB7Ci0JCQlyZXR1cm4gKChTdHJpbmdXcml0ZXIpIHRoaXMub3V0KS5nZXRCdWZmZXIoKS5sZW5ndGgoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmZpZyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZyB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycyA9IHRydWU7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHByb3BlcnR5QWNjZXNzVHlwZSA9IGZhbHNlOyAgLy8gYXMgb3Bwb3NlZCB0byAiZmllbGQiCi0KLQkJcHJpdmF0ZSBTdHJpbmcgY29sbGVjdGlvblR5cGVOYW1lID0gU2V0LmNsYXNzLmdldE5hbWUoKTsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXggPSAiQ29sbGVjdGlvbiI7ICAvLyBlLmcuICJwcml2YXRlIFNldDxGb28+IGZvb0NvbGxlY3Rpb24iICAvLyROT04tTkxTLTEkCi0KLQkJcHJpdmF0ZSBpbnQgZmllbGRWaXNpYmlsaXR5ID0gTW9kaWZpZXIuUFJJVkFURTsKLQkJcHJpdmF0ZSBpbnQgbWV0aG9kVmlzaWJpbGl0eSA9IE1vZGlmaWVyLlBVQkxJQzsKLQotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNlcmlhbGl6YWJsZSA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQgPSB0cnVlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gdHJ1ZTsgIC8vIGFzIG9wcG9zZWQgdG8gSWRDbGFzcwotCQlwcml2YXRlIFN0cmluZyBlbWJlZGRlZElkQXR0cmlidXRlTmFtZSA9ICJwayI7ICAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgU3RyaW5nIHByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWUgPSAiUEsiOyAgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBrZXkgPSB0YWJsZQotCQkgKiB2YWx1ZSA9IGVudGl0eSBuYW1lCi0JCSAqLwotCQlwcml2YXRlIEhhc2hNYXA8VGFibGUsIFN0cmluZz4gdGFibGVzID0gbmV3IEhhc2hNYXA8VGFibGUsIFN0cmluZz4oKTsKLQotCQlwcml2YXRlIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyID0gRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuRGVmYXVsdC5JTlNUQU5DRTsKLQotCQlwcml2YXRlIE92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXIgPSBPdmVyd3JpdGVDb25maXJtZXIuTmV2ZXIuSU5TVEFOQ0U7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURSA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0UgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNURUQgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUMgPSAzOwotCi0KLQkJcHVibGljIGJvb2xlYW4gY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVyczsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycyhib29sZWFuIGNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzKSB7Ci0JCQl0aGlzLmNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzID0gY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eUFjY2Vzc1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHlBY2Nlc3NUeXBlKGJvb2xlYW4gcHJvcGVydHlBY2Nlc3NUeXBlKSB7Ci0JCQl0aGlzLnByb3BlcnR5QWNjZXNzVHlwZSA9IHByb3BlcnR5QWNjZXNzVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGZpZWxkQWNjZXNzVHlwZSgpIHsKLQkJCXJldHVybiAhIHRoaXMucHJvcGVydHlBY2Nlc3NUeXBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZpZWxkQWNjZXNzVHlwZShib29sZWFuIGZpZWxkQWNjZXNzVHlwZSkgewotCQkJdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGUgPSAhIGZpZWxkQWNjZXNzVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvblR5cGVOYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb25UeXBlTmFtZShTdHJpbmcgY29sbGVjdGlvblR5cGVOYW1lKSB7Ci0JCQl0aGlzLmNoZWNrUmVxdWlyZWRTdHJpbmcoY29sbGVjdGlvblR5cGVOYW1lLCAiY29sbGVjdGlvbiB0eXBlIG5hbWUgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuY29sbGVjdGlvblR5cGVOYW1lID0gY29sbGVjdGlvblR5cGVOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4KFN0cmluZyBjb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCA9IGNvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRGaWVsZFZpc2liaWxpdHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWVsZFZpc2liaWxpdHk7Ci0JCX0KLQkJLyoqIGVudGl0eSBmaWVsZHMgY2Fubm90IGJlICdwdWJsaWMnICovCi0JCXB1YmxpYyB2b2lkIHNldEZpZWxkVmlzaWJpbGl0eShpbnQgZmllbGRWaXNpYmlsaXR5KSB7Ci0JCQlzd2l0Y2ggKGZpZWxkVmlzaWJpbGl0eSkgewotCQkJCWNhc2UgUFJJVkFURToKLQkJCQljYXNlIFBBQ0tBR0U6Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJCXRoaXMuZmllbGRWaXNpYmlsaXR5ID0gZmllbGRWaXNpYmlsaXR5OwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGZpZWxkIHZpc2liaWxpdHk6ICIgKyBmaWVsZFZpc2liaWxpdHkpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCVN0cmluZyBnZXRGaWVsZFZpc2liaWxpdHlDbGF1c2UoKSB7Ci0JCQlzd2l0Y2ggKHRoaXMuZmllbGRWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUklWQVRFOgotCQkJCQlyZXR1cm4gInByaXZhdGUiOyAgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgUEFDS0FHRToKLQkJCQkJcmV0dXJuICIiOyAgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCQlyZXR1cm4gInByb3RlY3RlZCI7ICAvLyROT04tTkxTLTEkCi0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBmaWVsZCB2aXNpYmlsaXR5OiAiICsgdGhpcy5maWVsZFZpc2liaWxpdHkpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNZXRob2RWaXNpYmlsaXR5KCkgewotCQkJcmV0dXJuIHRoaXMubWV0aG9kVmlzaWJpbGl0eTsKLQkJfQotCQkvKiogZW50aXR5IHByb3BlcnRpZXMgbXVzdCBiZSAncHVibGljJyBvciAncHJvdGVjdGVkJyAqLwotCQlwdWJsaWMgdm9pZCBzZXRNZXRob2RWaXNpYmlsaXR5KGludCBtZXRob2RWaXNpYmlsaXR5KSB7Ci0JCQlzd2l0Y2ggKG1ldGhvZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQljYXNlIFBVQkxJQzoKLQkJCQkJdGhpcy5tZXRob2RWaXNpYmlsaXR5ID0gbWV0aG9kVmlzaWJpbGl0eTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBtZXRob2QgdmlzaWJpbGl0eTogIiArIG1ldGhvZFZpc2liaWxpdHkpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCVN0cmluZyBnZXRNZXRob2RWaXNpYmlsaXR5Q2xhdXNlKCkgewotCQkJc3dpdGNoICh0aGlzLm1ldGhvZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQkJcmV0dXJuICJwcm90ZWN0ZWQiOyAgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgUFVCTElDOgotCQkJCQlyZXR1cm4gInB1YmxpYyI7ICAvLyROT04tTkxTLTEkCi0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBtZXRob2QgdmlzaWJpbGl0eTogIiArIHRoaXMubWV0aG9kVmlzaWJpbGl0eSk7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVyczsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycykgewotCQkJdGhpcy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzID0gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVyczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcikgewotCQkJdGhpcy5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciA9IGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VyaWFsaXphYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuc2VyaWFsaXphYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNlcmlhbGl6YWJsZShib29sZWFuIHNlcmlhbGl6YWJsZSkgewotCQkJdGhpcy5zZXJpYWxpemFibGUgPSBzZXJpYWxpemFibGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCA9IGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKSB7Ci0JCQl0aGlzLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsgPSBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSygpIHsKLQkJCXJldHVybiAhIHRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLKGJvb2xlYW4gZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSykgewotCQkJdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gISBnZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lKFN0cmluZyBlbWJlZGRlZElkQXR0cmlidXRlTmFtZSkgewotCQkJdGhpcy5jaGVja1JlcXVpcmVkU3RyaW5nKGVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lLCAiRW1iZWRkZWRJZCBhdHRyaWJ1dGUgbmFtZSBpcyByZXF1aXJlZCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5lbWJlZGRlZElkQXR0cmlidXRlTmFtZSA9IGVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKFN0cmluZyBwcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKSB7Ci0JCQl0aGlzLmNoZWNrUmVxdWlyZWRTdHJpbmcocHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSwgInByaW1hcnkga2V5IG1lbWJlciBjbGFzcyBuYW1lIGlzIHJlcXVpcmVkIik7ICAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWUgPSBwcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lOwotCQl9Ci0KLQkJU3RyaW5nIGdldEVudGl0eU5hbWUoVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0aGlzLnRhYmxlcy5nZXQodGFibGUpOwotCQl9Ci0JCUl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YWJsZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJfQotCQlpbnQgdGFibGVzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnRhYmxlcy5zaXplKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVGFibGUoVGFibGUgdGFibGUsIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCQlpZiAodGFibGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGFibGUgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuY2hlY2tSZXF1aXJlZFN0cmluZyhlbnRpdHlOYW1lLCAiZW50aXR5IG5hbWUgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmICh0aGlzLnRhYmxlcy5jb250YWluc0tleSh0YWJsZSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgdGFibGU6ICIgKyB0YWJsZS5nZXROYW1lKCkpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHRoaXMudGFibGVzLnZhbHVlcygpLmNvbnRhaW5zKGVudGl0eU5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIGVudGl0eSBuYW1lOiAiICsgZW50aXR5TmFtZSk7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoICEgTmFtZVRvb2xzLnN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoZW50aXR5TmFtZSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbnRpdHkgbmFtZSBpcyBub3QgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXI6ICIgKyBlbnRpdHlOYW1lKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChOYW1lVG9vbHMuSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMoZW50aXR5TmFtZSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbnRpdHkgbmFtZSBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZDogIiArIGVudGl0eU5hbWUpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy50YWJsZXMucHV0KHRhYmxlLCBlbnRpdHlOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBnZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpIHsKLQkJCXJldHVybiB0aGlzLmRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKSB7Ci0JCQlpZiAoZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZGF0YWJhc2UgYW5ub3RhdGlvbiBuYW1lIGJ1aWxkZXIgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPSBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLQkJfQotCi0JCXB1YmxpYyBPdmVyd3JpdGVDb25maXJtZXIgZ2V0T3ZlcndyaXRlQ29uZmlybWVyKCkgewotCQkJcmV0dXJuIHRoaXMub3ZlcndyaXRlQ29uZmlybWVyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZUNvbmZpcm1lcihPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyKSB7Ci0JCQlpZiAob3ZlcndyaXRlQ29uZmlybWVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm92ZXJ3cml0ZSBjb25maXJtZXIgaXMgcmVxdWlyZWQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMub3ZlcndyaXRlQ29uZmlybWVyID0gb3ZlcndyaXRlQ29uZmlybWVyOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZWRTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcndyaXRlIGNvbmZpcm1lciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPdmVyd3JpdGVDb25maXJtZXIgewotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBnZW5lcmF0b3Igc2hvdWxkIG92ZXJ3cml0ZSB0aGUgc3BlY2lmaWVkCi0JCSAqIGZpbGUuCi0JCSAqLwotCQlib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgY2xhc3NOYW1lKTsKLQotCi0JCWZpbmFsIGNsYXNzIEFsd2F5cyBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBJTlNUQU5DRSA9IG5ldyBBbHdheXMoKTsKLQkJCXB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlQ29uZmlybWVyIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgQWx3YXlzKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBldmVyeXRoaW5nIHdpbGwgYmUgb3ZlcndyaXR0ZW4KLQkJCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiT3ZlcndyaXRlQ29uZmlybWVyLkFsd2F5cyI7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCWZpbmFsIGNsYXNzIE5ldmVyIGltcGxlbWVudHMgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIElOU1RBTkNFID0gbmV3IE5ldmVyKCk7Ci0JCQlwdWJsaWMgc3RhdGljIE92ZXJ3cml0ZUNvbmZpcm1lciBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE5ldmVyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBub3RoaW5nIHdpbGwgYmUgb3ZlcndyaXR0ZW4KLQkJCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5OZXZlciI7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIG5hbWUgYnVpbGRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQcm92aWRlIGEgcGx1Z2dhYmxlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgaG93IHRoZSBlbnRpdHkgZ2VuZXJhdG9yCi0JICogcHJpbnRzIHRoZSBuYW1lcyBvZiB2YXJpb3VzIGRhdGFiYXNlIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgewotCi0JCS8qKgotCQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBlbnRpdHkgYW5kIHRoZSB0YWJsZSB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBlbnRpdHkncwotCQkgKiBUYWJsZSBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkKLQkJICogbWFwcyB0byB0aGUgdGFibGUgYnkgZGVmYXVsdC4KLQkJICovCi0JCVN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKTsKLQotCQkvKioKLQkJICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgYW5kIHRoZSBjb2x1bW4KLQkJICogdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkJICogQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQotCQkgKiBtYXBzIHRvIHRoZSBjb2x1bW4gYnkgZGVmYXVsdC4KLQkJICovCi0JCVN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKTsKLQotCQkvKioKLQkJICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgYW5kIHRoZQotCQkgKiBtYW55LXRvLW9uZSBvciBtYW55LXRvLW1hbnkgZm9yZWlnbiBrZXkgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkJICogSm9pbkNvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKLQkJICogbWFwcyB0byB0aGUgam9pbiBjb2x1bW4gYnkgZGVmYXVsdC4KLQkJICogVGhlIHNwZWNpZmllZCBmb3JlaWduIGtleSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2x1bW4gcGFpciB3aG9zZQotCQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCQkgKiBrZXkncyByZWZlcmVuY2VkIHRhYmxlLgotCQkgKi8KLQkJU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpOwotCi0JCS8qKgotCQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5Db2x1bW4KLQkJICogYW5ub3RhdGlvbidzICduYW1lJyBvciAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGVsZW1lbnQuCi0JCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW9uZSBhbmQgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4KLQkJICogdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbmFtZSBhbmQvb3IgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBhcmUvaXMKLQkJICogbm90IGFwcGxpY2FibGUuCi0JCSAqIEBzZWUgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nLCBGb3JlaWduS2V5KQotCQkgKi8KLQkJU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pOwotCi0JCS8qKgotCQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5UYWJsZQotCQkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuCi0JCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW1hbnkgbWFwcGluZ3Mgd2hlbiB0aGUgZGVmYXVsdAotCQkgKiBqb2luIHRhYmxlIG5hbWUgaXMgbm90IGFwcGxpY2FibGUuCi0JCSAqLwotCQlTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSk7Ci0KLQotCQkvKioKLQkJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGxlIHJldHVybnMgdGhlIGRhdGFiYXNlIG9iamVjdCdzIG5hbWUsCi0JCSAqIHVuYWx0ZXJlZC4KLQkJICovCi0JCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJCXB1YmxpYyBzdGF0aWMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpIHsKLQkJCQlyZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJCQlyZXR1cm4gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQkJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCQkJcmV0dXJuIHRhYmxlLmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLkRlZmF1bHQiOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL0dlblNjb3BlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9HZW5TY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjYzNDVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL0dlblNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogQnVpbGQgYSBHZW5UYWJsZSBmb3IgZWFjaCBkYi5UYWJsZSBwYXNzZWQgaW4uCi0gKiBEZXRlcm1pbmUgYWxsIHRoZSByZWxhdGlvbnMgYW1vbmcgdGhlIHRhYmxlcyBpbiB0aGUgc2NvcGU6Ci0gKiAgICAgbWFueS10by1tYW55Ci0gKiAgICAgbWFueS10by1vbmUKLSAqICAgICBvbmUtdG8tbWFueQotICogTWFrZSBhIGZpcnN0IHBhc3MgdG8gZGV0ZXJtaW5lIGVhY2ggZW50aXR5IHRhYmxlJ3MgSmF2YSBhdHRyaWJ1dGUgbmFtZXMsCi0gKiBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0aGVtIG9uIHN1YnNlcXVlbnQgcGFzc2VzLgotICovCi1jbGFzcyBHZW5TY29wZSB7Ci0JcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8VGFibGUsIEdlblRhYmxlPiBnZW5UYWJsZXM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUdlblNjb3BlKEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKLQkJdGhpcy5nZW5UYWJsZXMgPSBuZXcgSGFzaE1hcDxUYWJsZSwgR2VuVGFibGU+KGVudGl0eUNvbmZpZy50YWJsZXNTaXplKCkpOwotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KHByb2dyZXNzTW9uaXRvciwgSnB0R2VuTWVzc2FnZXMuR2VuU2NvcGVfdGFza05hbWUsIDQpOwotCi0JCXRoaXMuYnVpbGRHZW5UYWJsZXMoKTsKLQkJc20ud29ya2VkKDEpOwotCQl0aGlzLmNoZWNrQ2FuY2VsZWQoc20pOwotCi0JCXRoaXMuYnVpbGRNYW55VG9NYW55UmVsYXRpb25zKCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJdGhpcy5jaGVja0NhbmNlbGVkKHNtKTsKLQotCQl0aGlzLmJ1aWxkTWFueVRvT25lUmVsYXRpb25zKCk7ICAvLyB0aGlzIHdpbGwgYWxzbyBidWlsZCB0aGUgY29ycmVzcG9uZGluZyBvbmUtdG8tbWFueSByZWxhdGlvbnMKLQkJc20ud29ya2VkKDEpOwotCQl0aGlzLmNoZWNrQ2FuY2VsZWQoc20pOwotCi0JCXRoaXMuYnVpbGRBdHRyaWJ1dGVOYW1lcygpOwotCQlzbS53b3JrZWQoMSk7Ci0JCXRoaXMuY2hlY2tDYW5jZWxlZChzbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkR2VuVGFibGVzKCkgewotCQlmb3IgKEl0ZXJhdG9yPFRhYmxlPiBzdHJlYW0gPSBlbnRpdHlDb25maWcudGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJVGFibGUgdGFibGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5nZW5UYWJsZXMucHV0KHRhYmxlLCBuZXcgR2VuVGFibGUodGhpcywgdGFibGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYWxsIHRoZSAiam9pbiIgdGFibGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTWFueVRvTWFueVJlbGF0aW9ucygpIHsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmJ1aWxkSm9pblRhYmxlUmVsYXRpb24oKTsKLQkJfQotCi0JCS8vIHJldmVydCBhbnkgImpvaW4iIHRhYmxlIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIHRhYmxlIGJhY2sgdG8gYW4gImVudGl0eSIgdGFibGUKLQkJSGFzaFNldDxHZW5UYWJsZT4gcmVmZXJlbmNlZEdlblRhYmxlcyA9IHRoaXMuYnVpbGRSZWZlcmVuY2VkR2VuVGFibGVzKCk7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuam9pbkdlblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUdlblRhYmxlIGpvaW5HZW5UYWJsZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocmVmZXJlbmNlZEdlblRhYmxlcy5jb250YWlucyhqb2luR2VuVGFibGUpKSB7Ci0JCQkJam9pbkdlblRhYmxlLmNsZWFySm9pblRhYmxlUmVsYXRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYWxsIHRoZSBtYW55LXRvLW9uZSBhbmQgY29ycmVzcG9uZGluZyBvbmUtdG8tbWFueSByZWxhdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRNYW55VG9PbmVSZWxhdGlvbnMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuZW50aXR5R2VuVGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5idWlsZE1hbnlUb09uZVJlbGF0aW9ucygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGV0ZXJtaW5lIGFsbCB0aGUgSmF2YSBhdHRyaWJ1dGUgbmFtZXMgdXAtZnJvbnQgYmVjYXVzZSB3ZSB3aWxsCi0JICogbmVlZCB0aGVtIGZvciB0aGluZ3MgbGlrZSAnbWFwcGVkQnknIGFubm90YXRpb24gZWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRBdHRyaWJ1dGVOYW1lcygpIHsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5lbnRpdHlHZW5UYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmJ1aWxkQXR0cmlidXRlTmFtZXMoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIEFQSSAqKioqKioqKioqCi0KLQlFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGdldEVudGl0eUNvbmZpZygpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5Q29uZmlnOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBvbmx5IHRoZSBnZW4gdGFibGVzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciBnZW5lcmF0aW5nCi0JICogZW50aXRpZXMgKGkuZS4gZXhjbHVkZSB0aGUgImpvaW4iIHRhYmxlcykKLQkgKi8KLQlJdGVyYXRvcjxHZW5UYWJsZT4gZW50aXR5R2VuVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEdlblRhYmxlLCBHZW5UYWJsZT4odGhpcy5nZW5UYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoR2VuVGFibGUgZ2VuVGFibGUpIHsKLQkJCQlyZXR1cm4gISBnZW5UYWJsZS5pc0pvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCWludCBlbnRpdHlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5lbnRpdHlHZW5UYWJsZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBnZW4gdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGRiIHRhYmxlOwotCSAqIHJldHVybiBudWxsIGlmIHRoZSBnZW4gdGFibGUgaXMgbm90ICJpbi1zY29wZSIgKGUuZy4gYSBkYiBmb3JlaWduIGtleQotCSAqIG1pZ2h0IGhhdmUgYSByZWZlcmVuY2UgdG8gYSBkYiB0YWJsZSB0aGF0IHdhcyBub3QgaW5jbHVkZWQgaW4gdGhlCi0JICogc2NvcGUsIHNvIHdlIHdvbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGdlbiB0YWJsZSkKLQkgKi8KLQlHZW5UYWJsZSBnZXRHZW5UYWJsZShUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZXMuZ2V0KHRhYmxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIEl0ZXJhdG9yPEdlblRhYmxlPiBnZW5UYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgaW50IGdlblRhYmxlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG9ubHkgdGhlICJqb2luIiBnZW4gdGFibGVzCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHZW5UYWJsZT4gam9pbkdlblRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxHZW5UYWJsZSwgR2VuVGFibGU+KHRoaXMuZ2VuVGFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEdlblRhYmxlIGdlblRhYmxlKSB7Ci0JCQkJcmV0dXJuIGdlblRhYmxlLmlzSm9pblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSBzZXQgb2YgdGhlIGdlbiB0YWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBvdGhlciBnZW4gdGFibGVzCi0JICogaW4gdGhlIHNjb3BlCi0JICovCi0JcHJpdmF0ZSBIYXNoU2V0PEdlblRhYmxlPiBidWlsZFJlZmVyZW5jZWRHZW5UYWJsZXMoKSB7Ci0JCUhhc2hTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRHZW5UYWJsZXMgPSBuZXcgSGFzaFNldDxHZW5UYWJsZT4odGhpcy5nZW5UYWJsZXNTaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkUmVmZXJlbmNlZEdlblRhYmxlc1RvKHJlZmVyZW5jZWRHZW5UYWJsZXMpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkR2VuVGFibGVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWlmIChwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2VuVGFibGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL0dlblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9HZW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmEzZDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL0dlblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotLyoqCi0gKiBhc3NvY2lhdGUgYSB0YWJsZSB3aXRoIHRoZSB2YXJpb3VzIHJlbGF0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuCi0gKiBnZW5lcmF0aW5nIHRoZSBlbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgdGFibGUKLSAqLwotY2xhc3MgR2VuVGFibGUgewotCXByaXZhdGUgZmluYWwgR2VuU2NvcGUgc2NvcGU7Ci0JcHJpdmF0ZSBmaW5hbCBUYWJsZSB0YWJsZTsKLQotCS8vIHRoZXNlIHJlbGF0aW9ucyBjYW5ub3QgYmUgYnVpbHQgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBidWlsdCBhbGwgdGhlIHNjb3BlJ3MgdGFibGVzCi0JcHJpdmF0ZSBNYW55VG9NYW55UmVsYXRpb24gam9pblRhYmxlUmVsYXRpb247Ci0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TWFueVRvTWFueVJlbGF0aW9uPiBvd25lZE1hbnlUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxNYW55VG9NYW55UmVsYXRpb24+IG5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWFueVRvTWFueVJlbGF0aW9uPigpOwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE1hbnlUb09uZVJlbGF0aW9uPiBtYW55VG9PbmVSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb09uZVJlbGF0aW9uPigpOwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE9uZVRvTWFueVJlbGF0aW9uPiBvbmVUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9uZVRvTWFueVJlbGF0aW9uPigpOwotCXByaXZhdGUgZmluYWwgSGFzaFNldDxDb2x1bW4+IGZvcmVpZ25LZXlDb2x1bW5zID0gbmV3IEhhc2hTZXQ8Q29sdW1uPigpOwotCi0JcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZUZvckVtYmVkZGVkSWQ7Ci0JcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPENvbHVtbiwgU3RyaW5nPiBiYXNpY0F0dHJpYnV0ZU5hbWVzID0gbmV3IEhhc2hNYXA8Q29sdW1uLCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPE1hbnlUb09uZVJlbGF0aW9uLCBTdHJpbmc+IG1hbnlUb09uZUF0dHJpYnV0ZU5hbWVzID0gbmV3IEhhc2hNYXA8TWFueVRvT25lUmVsYXRpb24sIFN0cmluZz4oKTsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8T25lVG9NYW55UmVsYXRpb24sIFN0cmluZz4gb25lVG9NYW55QXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaE1hcDxPbmVUb01hbnlSZWxhdGlvbiwgU3RyaW5nPigpOwotCXByaXZhdGUgZmluYWwgSGFzaE1hcDxNYW55VG9NYW55UmVsYXRpb24sIFN0cmluZz4gb3duZWRNYW55VG9NYW55QXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaE1hcDxNYW55VG9NYW55UmVsYXRpb24sIFN0cmluZz4oKTsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8TWFueVRvTWFueVJlbGF0aW9uLCBTdHJpbmc+IG5vbk93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzID0gbmV3IEhhc2hNYXA8TWFueVRvTWFueVJlbGF0aW9uLCBTdHJpbmc+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUdlblRhYmxlKEdlblNjb3BlIHNjb3BlLCBUYWJsZSB0YWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGFja2FnZSBBUEkgKioqKioqKioqKgotCi0JRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBnZXRFbnRpdHlDb25maWcoKSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlLmdldEVudGl0eUNvbmZpZygpOwotCX0KLQotCS8qKgotCSAqIGV4YW1wbGVzOgotCSAqICAgR2VuVGFibGUoRk9PKSA9PiAiRk9PX0NPTExFQ1RJT04iCi0JICogICBHZW5UYWJsZShmb28pID0+ICJmb29Db2xsZWN0aW9uIgotCSAqICAgR2VuVGFibGUoRm9vKSA9PiAiRm9vQ29sbGVjdGlvbiIKLQkgKi8KLQlTdHJpbmcgZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCVN0cmluZyBzdWZmaXggPSB0aGlzLmdldEVudGl0eUNvbmZpZygpLmdldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4KCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShuYW1lKSkgeyAgLy8gaG1tbSAgfmJqdgotCQkJc3VmZml4ID0gJ18nICsgc3VmZml4LnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWUgKyBzdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlIHdpdGhpbiB0aGUgdGFibGUncyBzY29wZTsKLQkgKiB0aGlzIGNhbiBiZSByZW1vdmVkLCBsYXRlciwgaWYgd2UgZmluZCBhbm90aGVyIHRhYmxlIHJlZmVyZW5jZXMgdGhlLAotCSAqIHNlZW1pbmdseSwgam9pbiB0YWJsZQotCSAqIEBzZWUgI2NsZWFySm9pblRhYmxlUmVsYXRpb24oKSAoYW5kIGNhbGxlcnMpCi0JICovCi0Jdm9pZCBidWlsZEpvaW5UYWJsZVJlbGF0aW9uKCkgewotCQlpZiAoICEgdGhpcy50YWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpIHsKLQkJCXJldHVybjsgIC8vIHRoZSB0YWJsZSBtdXN0IGhhdmUgZXhhY3RseSAyIGZvcmVpZ24ga2V5cwotCQl9Ci0JCUZvcmVpZ25LZXkgb3duaW5nRksgPSB0aGlzLnRhYmxlLmdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKTsKLQkJR2VuVGFibGUgb3duaW5nR2VuVGFibGUgPSB0aGlzLnNjb3BlLmdldEdlblRhYmxlKG93bmluZ0ZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQkJaWYgKG93bmluZ0dlblRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIGJvdGggdGFibGVzIG11c3QgYmUgaW4gdGhlIHNjb3BlCi0JCX0KLQkJRm9yZWlnbktleSBub25Pd25pbmdGSyA9IHRoaXMudGFibGUuZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpOwotCQlHZW5UYWJsZSBub25Pd25pbmdHZW5UYWJsZSA9IHRoaXMuc2NvcGUuZ2V0R2VuVGFibGUobm9uT3duaW5nRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQlpZiAobm9uT3duaW5nR2VuVGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gYm90aCB0YWJsZXMgbXVzdCBiZSBpbiB0aGUgc2NvcGUKLQkJfQotCQl0aGlzLmpvaW5UYWJsZVJlbGF0aW9uID0gbmV3IE1hbnlUb01hbnlSZWxhdGlvbigKLQkJCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCQkJb3duaW5nRkssCi0JCQkJCQkJCQkJCW93bmluZ0dlblRhYmxlLAotCQkJCQkJCQkJCQlub25Pd25pbmdGSywKLQkJCQkJCQkJCQkJbm9uT3duaW5nR2VuVGFibGUKLQkJCQkJCQkJCQkpOwotCX0KLQotCS8qKgotCSAqIHVzZWQgYnkgdGhlIHNjb3BlIHRvIGZpZ3VyZSBvdXQgd2hldGhlciAiam9pbiIgdGFibGVzIHNob3VsZCBiZQotCSAqIGNvbnZlcnRlZCB0byAiZW50aXR5IiB0YWJsZXMKLQkgKi8KLQl2b2lkIGFkZFJlZmVyZW5jZWRHZW5UYWJsZXNUbyhTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleSBmayA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlHZW5UYWJsZSBnZW5UYWJsZSA9IHRoaXMuc2NvcGUuZ2V0R2VuVGFibGUoZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQkJaWYgKGdlblRhYmxlICE9IG51bGwpIHsKLQkJCQlyZWZlcmVuY2VkVGFibGVzLmFkZChnZW5UYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgc2NvcGUgY2xlYXJzIHRoZSBqb2luIHRhYmxlIHJlbGF0aW9uIGlmIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSBqb2luIHRhYmxlIGZyb20gb3RoZXIgdGFibGVzIGluIHRoZSBzY29wZQotCSAqLwotCXZvaWQgY2xlYXJKb2luVGFibGVSZWxhdGlvbigpIHsKLQkJdGhpcy5qb2luVGFibGVSZWxhdGlvbi5jbGVhcigpOwotCQl0aGlzLmpvaW5UYWJsZVJlbGF0aW9uID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kICJpbi1zY29wZSIgZm9yZWlnbiBrZXlzCi0JICovCi0Jdm9pZCBidWlsZE1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleSBmayA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlHZW5UYWJsZSByZWZlcmVuY2VkR2VuVGFibGUgPSB0aGlzLnNjb3BlLmdldEdlblRhYmxlKGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQkJCWlmIChyZWZlcmVuY2VkR2VuVGFibGUgIT0gbnVsbCkgewotCQkJCXRoaXMubWFueVRvT25lUmVsYXRpb25zLmFkZChuZXcgTWFueVRvT25lUmVsYXRpb24odGhpcywgZmssIHJlZmVyZW5jZWRHZW5UYWJsZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogbm93IHRoYXQgYWxsIHRoZSByZWxhdGlvbnMgYXJlIGluIHBsYWNlLCB3ZSBjYW4gY29uZmlndXJlIHRoZSBKYXZhCi0JICogYXR0cmlidXRlIG5hbWVzCi0JICovCi0Jdm9pZCBidWlsZEF0dHJpYnV0ZU5hbWVzKCkgewotCQl0aGlzLmJ1aWxkQXR0cmlidXRlTmFtZUZvckVtYmVkZGVkSWQoKTsKLQotCQkvLyBnYXRoZXIgdXAgYWxsIHRoZSB0YWJsZSdzIGNvbHVtbnMuLi4KLQkJU2V0PENvbHVtbj4gY29sdW1ucyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy50YWJsZS5jb2x1bW5zKCksIHRoaXMudGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCS8vIC4uLnJlbW92ZSB0aGUgY29sdW1ucyB0aGF0IGJlbG9uZyBleGNsdXNpdmVseSB0byBtYW55LXRvLW9uZSBmb3JlaWduIGtleXMuLi4KLQkJdGhpcy5idWlsZE1hbnlUb09uZUF0dHJpYnV0ZU5hbWVzKGNvbHVtbnMpOwotCQkvLyAuLi5hbmQgdXNlIHRoZSByZW1haW5pbmcgY29sdW1ucyB0byBnZW5lcmF0ZSAiYmFzaWMiIGF0dHJpYnV0ZSBuYW1lcwotCQl0aGlzLmJ1aWxkQmFzaWNBdHRyaWJ1dGVOYW1lcyhjb2x1bW5zKTsKLQotCQl0aGlzLmJ1aWxkT25lVG9NYW55QXR0cmlidXRlTmFtZXMoKTsKLQkJdGhpcy5idWlsZE93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCXRoaXMuYnVpbGROb25Pd25lZE1hbnlUb01hbnlBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1ucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5Ci0JICogYnV0IGFyZSBhbHNvIHBhcnQgb2YgYW4gImluLXNjb3BlIiBmb3JlaWduIGtleQotCSAqLwotCUl0ZXJhdG9yPENvbHVtbj4gcmVhZE9ubHlQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxDb2x1bW4sIENvbHVtbj4odGhpcy50YWJsZS5wcmltYXJ5S2V5Q29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChDb2x1bW4gcGtDb2x1bW4pIHsKLQkJCQlyZXR1cm4gcGtDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHRhYmxlJ3MgcHJpbWFyeSBrZXkKLQkgKiBidXQgYXJlIE5PVCBwYXJ0IG9mIGFueSAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5Ci0JICovCi0JSXRlcmF0b3I8Q29sdW1uPiB3cml0YWJsZVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbiwgQ29sdW1uPih0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBwa0NvbHVtbikgewotCQkJCXJldHVybiAhIHBrQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1ucyB0aGF0IE5FSVRIRVIgcGFydCBvZiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQotCSAqIE5PUiBwYXJ0IG9mIGFueSBmb3JlaWduIGtleQotCSAqLwotCUl0ZXJhdG9yPENvbHVtbj4gbm9uUHJpbWFyeUtleUJhc2ljQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxDb2x1bW4sIENvbHVtbj4odGhpcy50YWJsZS5jb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISAoY29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpIHx8IGNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JVGFibGUgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlOwotCX0KLQotCVN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlDb25maWcoKS5nZXRFbnRpdHlOYW1lKHRoaXMudGFibGUpOwotCX0KLQotCWJvb2xlYW4gaXNKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVJlbGF0aW9uICE9IG51bGw7Ci0JfQotCi0Jdm9pZCBhZGRPd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5vd25lZE1hbnlUb01hbnlSZWxhdGlvbnMuYWRkKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZU93bmVkTWFueVRvTWFueVJlbGF0aW9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5yZW1vdmUocmVsYXRpb24pOwotCX0KLQotCXZvaWQgYWRkTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zLmFkZChyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCByZW1vdmVOb25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMucmVtb3ZlKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIGFkZE9uZVRvTWFueVJlbGF0aW9uKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMub25lVG9NYW55UmVsYXRpb25zLmFkZChyZWxhdGlvbik7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvT25lUmVsYXRpb24+IG1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8T25lVG9NYW55UmVsYXRpb24+IG9uZVRvTWFueVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMub25lVG9NYW55UmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBvd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5pdGVyYXRvcigpOwotCX0KLQotCUl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gbm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHdpbGwgcmV0dXJuIG51bGwgaWYgd2UgZG9uJ3Qgd2FudCBhbiBlbWJlZGRlZCBpZCBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZUZvckVtYmVkZGVkSWQoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVGb3JFbWJlZGRlZElkOwotCX0KLQotCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lRm9yKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuYmFzaWNBdHRyaWJ1dGVOYW1lcy5nZXQoY29sdW1uKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZUZvcihNYW55VG9PbmVSZWxhdGlvbiByZWxhdGlvbikgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVBdHRyaWJ1dGVOYW1lcy5nZXQocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lRm9yKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLm9uZVRvTWFueUF0dHJpYnV0ZU5hbWVzLmdldChyZWxhdGlvbik7Ci0JfQotCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVGb3JPd25lZChNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMub3duZWRNYW55VG9NYW55QXR0cmlidXRlTmFtZXMuZ2V0KHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZUZvck5vbk93bmVkKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQlyZXR1cm4gdGhpcy5ub25Pd25lZE1hbnlUb01hbnlBdHRyaWJ1dGVOYW1lcy5nZXQocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpZiB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYW4gRW1iZWRkZWRJZCBhdHRyaWJ1dGUsIGFkZCBpdHMgbmFtZSB0bwotCSAqICdhdHRyaWJ1dGVOYW1lcycgc28gd2UgZG9uJ3QgY29sbGlkZSB3aXRoIGl0IGxhdGVyLCB3aGVuIGdlbmVyYXRpbmcKLQkgKiBhdHRyaWJ1dGUgbmFtZXMgZm9yIHRoZSBjb2x1bW5zIGV0Yy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRBdHRyaWJ1dGVOYW1lRm9yRW1iZWRkZWRJZCgpIHsKLQkJaWYgKCh0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5nZXRFbnRpdHlDb25maWcoKS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCXRoaXMuYXR0cmlidXRlTmFtZUZvckVtYmVkZGVkSWQgPSB0aGlzLmNvbmZpZ3VyZUF0dHJpYnV0ZU5hbWUodGhpcy5nZXRFbnRpdHlDb25maWcoKS5nZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdoaWxlIHdlIGFyZSBmaWd1cmluZyBvdXQgdGhlIG5hbWVzIGZvciB0aGUgbToxIGF0dHJpYnV0ZXMsIHJlbW92ZSBmcm9tIHRoZQotCSAqIHNwZWNpZmllZCBzZXQgb2YgY29sdW1ucyB0aGUgY29sdW1ucyB0aGF0IGFyZSBvbmx5IHBhcnQgb2YgdGhlIGZvcmVpZ24ga2V5cwotCSAqIChsZWF2aW5nIHRoZSByZW1haW5pbmcgY29sdW1ucyBmb3IgYmFzaWMgYXR0cmlidXRlcykuCi0JICogU3RvcmUgdGhlIGNhbGN1bGF0ZWQgbmFtZXMgc28gd2UgY2FuIGdldCB0aGVtIGJhY2sgbGF0ZXIsIHdoZW4gd2UKLQkgKiBhcmUgZ2VuZXJhdGluZyBzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTWFueVRvT25lQXR0cmlidXRlTmFtZXMoU2V0PENvbHVtbj4gY29sdW1ucykgewotCQlmb3IgKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uIDogdGhpcy5tYW55VG9PbmVSZWxhdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoY29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLm5vblByaW1hcnlLZXlCYXNlQ29sdW1ucygpKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5mb3JlaWduS2V5Q29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLmJhc2VDb2x1bW5zKCkpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmNvbmZpZ3VyZUF0dHJpYnV0ZU5hbWUocmVsYXRpb24uZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCXJlbGF0aW9uLnNldE1hcHBlZEJ5KGF0dHJpYnV0ZU5hbWUpOwotCQkJdGhpcy5tYW55VG9PbmVBdHRyaWJ1dGVOYW1lcy5wdXQocmVsYXRpb24sIGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSB1bmlxdWUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgImJhc2ljIiBjb2x1bW5zLAotCSAqIGNoZWNraW5nIGZvciBuYW1lIGNvbGxpc2lvbnMuCi0JICogU3RvcmUgdGhlIGNhbGN1bGF0ZWQgbmFtZXMgc28gd2UgY2FuIGdldCB0aGVtIGJhY2sgbGF0ZXIsIHdoZW4gd2UKLQkgKiBhcmUgZ2VuZXJhdGluZyBzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQmFzaWNBdHRyaWJ1dGVOYW1lcyhTZXQ8Q29sdW1uPiBjb2x1bW5zKSB7Ci0JCWZvciAoQ29sdW1uIGNvbHVtbiA6IGNvbHVtbnMpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gdGhpcy5jb25maWd1cmVBdHRyaWJ1dGVOYW1lKGNvbHVtbi5nZXROYW1lKCkpOwotCQkJdGhpcy5iYXNpY0F0dHJpYnV0ZU5hbWVzLnB1dChjb2x1bW4sIGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT25lVG9NYW55QXR0cmlidXRlTmFtZXMoKSB7Ci0JCWZvciAoT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm9uZVRvTWFueVJlbGF0aW9ucykgewotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmNvbmZpZ3VyZUF0dHJpYnV0ZU5hbWUocmVsYXRpb24uZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCXRoaXMub25lVG9NYW55QXR0cmlidXRlTmFtZXMucHV0KHJlbGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzKCkgewotCQlmb3IgKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHRoaXMuY29uZmlndXJlQXR0cmlidXRlTmFtZShyZWxhdGlvbi5nZXRPd25lZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlyZWxhdGlvbi5zZXRNYXBwZWRCeShhdHRyaWJ1dGVOYW1lKTsKLQkJCXRoaXMub3duZWRNYW55VG9NYW55QXR0cmlidXRlTmFtZXMucHV0KHJlbGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vbk93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzKCkgewotCQlmb3IgKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHRoaXMuY29uZmlndXJlQXR0cmlidXRlTmFtZShyZWxhdGlvbi5nZXROb25Pd25lZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQl0aGlzLm5vbk93bmVkTWFueVRvTWFueUF0dHJpYnV0ZU5hbWVzLnB1dChyZWxhdGlvbiwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG5hbWUgdG8gc29tZXRoaW5nIHVuaXF1ZSBmb3IgdGhlIGVudGl0eSwKLQkgKiBjb252ZXJ0aW5nIGl0IHRvIHNvbWV0aGluZyBKYXZhLWxpa2UgaWYgdGhlIGNvbmZpZyBmbGFnIGlzIHNldC4KLQkgKiBTdG9yZSB0aGUgY2FsY3VsYXRlZCBuYW1lIHRvIHByZXZlbnQgZnV0dXJlIG5hbWUgY29sbGlzaW9ucy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb25maWd1cmVBdHRyaWJ1dGVOYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBhdHRyaWJ1dGVOYW1lOwotCQlpZiAodGhpcy5nZXRFbnRpdHlDb25maWcoKS5jb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycygpKSB7Ci0JCQlyZXN1bHQgPSBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKHJlc3VsdCwgdGhpcy5hdHRyaWJ1dGVOYW1lcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmaXJzdCwgY29udmVydCB0aGUgYXR0cmlidXRlIG5hbWUgdG8gYSBsZWdhbCBKYXZhIGlkZW50aWZpZXIKLQkJCXJlc3VsdCA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcihyZXN1bHQpOwotCQkJLy8gdGhlbiBtYWtlIHN1cmUgaXQncyB1bmlxdWUKLQkJCXJlc3VsdCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShhdHRyaWJ1dGVOYW1lLCB0aGlzLmF0dHJpYnV0ZU5hbWVzKTsKLQkJfQotCQl0aGlzLmF0dHJpYnV0ZU5hbWVzLmFkZChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudGFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvSlBBLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9KUEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjMGNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9KUEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwub2xkOwotCi0KLS8qKgotICogSlBBIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKUEEgewotCi0JLy8gSlBBIHBhY2thZ2UKLQlTdHJpbmcgUEFDS0FHRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7Ci0JU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICcuJzsKLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLy8gSlBBIGFubm90YXRpb25zCi0JU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFID0gUEFDS0FHRV8gKyAiQXNzb2NpYXRpb25PdmVycmlkZSI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMgPSAiam9pbkNvbHVtbnMiOwotCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVMgPSBQQUNLQUdFXyArICJBc3NvY2lhdGlvbk92ZXJyaWRlcyI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFID0gUEFDS0FHRV8gKyAiQXR0cmlidXRlT3ZlcnJpZGUiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4gPSAiY29sdW1uIjsKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFUyA9IFBBQ0tBR0VfICsgIkF0dHJpYnV0ZU92ZXJyaWRlcyI7Ci0JCVN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEJBU0lDID0gUEFDS0FHRV8gKyAiQmFzaWMiOwotCQlTdHJpbmcgQkFTSUNfX0ZFVENIID0gImZldGNoIjsKLQkJU3RyaW5nIEJBU0lDX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JU3RyaW5nIENPTFVNTiA9IFBBQ0tBR0VfICsgIkNvbHVtbiI7Ci0JCVN0cmluZyBDT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBDT0xVTU5fX1VOSVFVRSA9ICJ1bmlxdWUiOwotCQlTdHJpbmcgQ09MVU1OX19OVUxMQUJMRSA9ICJudWxsYWJsZSI7Ci0JCVN0cmluZyBDT0xVTU5fX0lOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7Ci0JCVN0cmluZyBDT0xVTU5fX1VQREFUQUJMRSA9ICJ1cGRhdGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQkJU3RyaW5nIENPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQkJU3RyaW5nIENPTFVNTl9fUFJFQ0lTSU9OID0gInByZWNpc2lvbiI7Ci0JCVN0cmluZyBDT0xVTU5fX1NDQUxFID0gInNjYWxlIjsKLQlTdHJpbmcgQ09MVU1OX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkNvbHVtblJlc3VsdCI7Ci0JCVN0cmluZyBDT0xVTU5fUkVTVUxUX19OQU1FID0gIm5hbWUiOwotCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTiA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JDb2x1bW4iOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFID0gImRpc2NyaW1pbmF0b3JUeXBlIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRSA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JWYWx1ZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVNQkVEREFCTEUgPSBQQUNLQUdFXyArICJFbWJlZGRhYmxlIjsKLQlTdHJpbmcgRU1CRURERUQgPSBQQUNLQUdFXyArICJFbWJlZGRlZCI7Ci0JU3RyaW5nIEVNQkVEREVEX0lEID0gUEFDS0FHRV8gKyAiRW1iZWRkZWRJZCI7Ci0JU3RyaW5nIEVOVElUWSA9IFBBQ0tBR0VfICsgIkVudGl0eSI7Ci0JCVN0cmluZyBFTlRJVFlfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIEVOVElUWV9MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFbnRpdHlMaXN0ZW5lcnMiOwotCQlTdHJpbmcgRU5USVRZX0xJU1RFTkVSU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBFTlRJVFlfUkVTVUxUID0gUEFDS0FHRV8gKyAiRW50aXR5UmVzdWx0IjsKLQkJU3RyaW5nIEVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUyA9ICJlbnRpdHlDbGFzcyI7Ci0JCVN0cmluZyBFTlRJVFlfUkVTVUxUX19GSUVMRFMgPSAiZmllbGRzIjsKLQkJU3RyaW5nIEVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gImRpc2NyaW1pbmF0b3JDb2x1bW4iOwotCVN0cmluZyBFTlVNRVJBVEVEID0gUEFDS0FHRV8gKyAiRW51bWVyYXRlZCI7Ci0JCVN0cmluZyBFTlVNRVJBVEVEX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFeGNsdWRlRGVmYXVsdExpc3RlbmVycyI7Ci0JU3RyaW5nIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBQQUNLQUdFXyArICJFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyI7Ci0JU3RyaW5nIEZJRUxEX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkZpZWxkUmVzdWx0IjsKLQkJU3RyaW5nIEZJRUxEX1JFU1VMVF9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEZJRUxEX1JFU1VMVF9fQ09MVU1OID0gImNvbHVtbiI7Ci0JU3RyaW5nIEZMVVNIX01PREUgPSBQQUNLQUdFXyArICJGbHVzaE1vZGUiOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBHRU5FUkFURURfVkFMVUUgPSBQQUNLQUdFXyArICJHZW5lcmF0ZWRWYWx1ZSI7Ci0JCVN0cmluZyBHRU5FUkFURURfVkFMVUVfX1NUUkFURUdZID0gInN0cmF0ZWd5IjsKLQkJU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gImdlbmVyYXRvciI7Ci0JU3RyaW5nIElEID0gUEFDS0FHRV8gKyAiSWQiOwotCVN0cmluZyBJRF9DTEFTUyA9IFBBQ0tBR0VfICsgIklkQ2xhc3MiOwotCQlTdHJpbmcgSURfQ0xBU1NfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgSU5IRVJJVEFOQ0UgPSBQQUNLQUdFXyArICJJbmhlcml0YW5jZSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9fU1RSQVRFR1kgPSAic3RyYXRlZ3kiOwotCVN0cmluZyBKT0lOX0NPTFVNTiA9IFBBQ0tBR0VfICsgIkpvaW5Db2x1bW4iOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVU5JUVVFID0gInVuaXF1ZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fTlVMTEFCTEUgPSAibnVsbGFibGUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVVBEQVRBQkxFID0gInVwZGF0YWJsZSI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCVN0cmluZyBKT0lOX0NPTFVNTlMgPSBQQUNLQUdFXyArICJKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgSk9JTl9UQUJMRSA9IFBBQ0tBR0VfICsgIkpvaW5UYWJsZSI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gImpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gImludmVyc2VKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSAidW5pcXVlQ29uc3RyYWludHMiOwotCVN0cmluZyBMT0IgPSBQQUNLQUdFXyArICJMb2IiOwotCVN0cmluZyBNQU5ZX1RPX01BTlkgPSBQQUNLQUdFXyArICJNYW55VG9NYW55IjsKLQkJU3RyaW5nIE1BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9ICJ0YXJnZXRFbnRpdHkiOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19DQVNDQURFID0gImNhc2NhZGUiOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBNQU5ZX1RPX01BTllfX01BUFBFRF9CWSA9ICJtYXBwZWRCeSI7Ci0JU3RyaW5nIE1BTllfVE9fT05FID0gUEFDS0FHRV8gKyAiTWFueVRvT25lIjsKLQkJU3RyaW5nIE1BTllfVE9fT05FX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE1BTllfVE9fT05FX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotCVN0cmluZyBNQVBfS0VZID0gUEFDS0FHRV8gKyAiTWFwS2V5IjsKLQkJU3RyaW5nIE1BUF9LRVlfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gUEFDS0FHRV8gKyAiTWFwcGVkU3VwZXJjbGFzcyI7Ci0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTID0gUEFDS0FHRV8gKyAiTmFtZWROYXRpdmVRdWVyaWVzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWSA9IFBBQ0tBR0VfICsgIk5hbWVkTmF0aXZlUXVlcnkiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWSA9ICJxdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTID0gImhpbnRzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gInJlc3VsdENsYXNzIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gInJlc3VsdFNldE1hcHBpbmciOwotCVN0cmluZyBOQU1FRF9RVUVSSUVTID0gUEFDS0FHRV8gKyAiTmFtZWRRdWVyaWVzIjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJJRVNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgTkFNRURfUVVFUlkgPSBQQUNLQUdFXyArICJOYW1lZFF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTkFNRURfUVVFUllfX1FVRVJZID0gInF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19ISU5UUyA9ICJoaW50cyI7Ci0JU3RyaW5nIE9ORV9UT19NQU5ZID0gUEFDS0FHRV8gKyAiT25lVG9NYW55IjsKLQkJU3RyaW5nIE9ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE9ORV9UT19NQU5ZX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gIm1hcHBlZEJ5IjsKLQlTdHJpbmcgT05FX1RPX09ORSA9IFBBQ0tBR0VfICsgIk9uZVRvT25lIjsKLQkJU3RyaW5nIE9ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSAidGFyZ2V0RW50aXR5IjsKLQkJU3RyaW5nIE9ORV9UT19PTkVfX0NBU0NBREUgPSAiY2FzY2FkZSI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19NQVBQRURfQlkgPSAibWFwcGVkQnkiOwotCVN0cmluZyBPUkRFUl9CWSA9IFBBQ0tBR0VfICsgIk9yZGVyQnkiOwotCQlTdHJpbmcgT1JERVJfQllfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVCA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlQ29udGV4dCI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9fVU5JVF9OQU1FID0gInVuaXROYW1lIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfX1RZUEUgPSAidHlwZSI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRTID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VDb250ZXh0cyI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gUEFDS0FHRV8gKyAiWG1sUGVyc2lzdGVuY2VVbml0IjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19VTklUX05BTUUgPSAidW5pdE5hbWUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUUyA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlVW5pdHMiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVFNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUE9TVF9MT0FEID0gUEFDS0FHRV8gKyAiUG9zdExvYWQiOwotCVN0cmluZyBQT1NUX1BFUlNJU1QgPSBQQUNLQUdFXyArICJQb3N0UGVyc2lzdCI7Ci0JU3RyaW5nIFBPU1RfUkVNT1ZFID0gUEFDS0FHRV8gKyAiUG9zdFJlbW92ZSI7Ci0JU3RyaW5nIFBPU1RfVVBEQVRFID0gUEFDS0FHRV8gKyAiUG9zdFVwZGF0ZSI7Ci0JU3RyaW5nIFBSRV9QRVJTSVNUID0gUEFDS0FHRV8gKyAiUHJlUGVyc2lzdCI7Ci0JU3RyaW5nIFBSRV9SRU1PVkUgPSBQQUNLQUdFXyArICJQcmVSZW1vdmUiOwotCVN0cmluZyBQUkVfVVBEQVRFID0gUEFDS0FHRV8gKyAiUHJlVXBkYXRlIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSBQQUNLQUdFXyArICJQcmltYXJ5S2V5Sm9pbkNvbHVtbiI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9ICJjb2x1bW5EZWZpbml0aW9uIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gUEFDS0FHRV8gKyAiUHJpbWFyeUtleUpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBRVUVSWV9ISU5UID0gUEFDS0FHRV8gKyAiUXVlcnlIaW50IjsKLQkJU3RyaW5nIFFVRVJZX0hJTlRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBRVUVSWV9ISU5UX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFNFQ09OREFSWV9UQUJMRSA9IFBBQ0tBR0VfICsgIlNlY29uZGFyeVRhYmxlIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX1BLX0pPSU5fQ09MVU1OUyA9ICJwa0pvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFUyA9IFBBQ0tBR0VfICsgIlNlY29uZGFyeVRhYmxlcyI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUiA9IFBBQ0tBR0VfICsgIlNlcXVlbmNlR2VuZXJhdG9yIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSA9ICJzZXF1ZW5jZU5hbWUiOwotCQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFID0gImluaXRpYWxWYWx1ZSI7Ci0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSA9ICJhbGxvY2F0aW9uU2l6ZSI7Ci0JU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkcgPSBQQUNLQUdFXyArICJTcWxSZXN1bHRTZXRNYXBwaW5nIjsKLQkJU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVElFUyA9ICJlbnRpdGllcyI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5TID0gImNvbHVtbnMiOwotCVN0cmluZyBUQUJMRSA9IFBBQ0tBR0VfICsgIlRhYmxlIjsKLQkJU3RyaW5nIFRBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEFCTEVfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBUQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBUQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SID0gUEFDS0FHRV8gKyAiVGFibGVHZW5lcmF0b3IiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19UQUJMRSA9ICJ0YWJsZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSA9ICJwa0NvbHVtbk5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSA9ICJ2YWx1ZUNvbHVtbk5hbWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUgPSAicGtDb2x1bW5WYWx1ZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSAiaW5pdGlhbFZhbHVlIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gImFsbG9jYXRpb25TaXplIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgVEVNUE9SQUwgPSBQQUNLQUdFXyArICJUZW1wb3JhbCI7Ci0JCVN0cmluZyBURU1QT1JBTF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBUUkFOU0lFTlQgPSBQQUNLQUdFXyArICJUcmFuc2llbnQiOwotCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVCA9IFBBQ0tBR0VfICsgIlVuaXF1ZUNvbnN0cmFpbnQiOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyA9ICJjb2x1bW5OYW1lcyI7Ci0JU3RyaW5nIFZFUlNJT04gPSBQQUNLQUdFXyArICJWZXJzaW9uIjsKLQotCS8vIEpQQSBlbnVtcwotCVN0cmluZyBHRU5FUkFUSU9OX1RZUEUgPSBQQUNLQUdFXyArICJHZW5lcmF0aW9uVHlwZSI7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfID0gR0VORVJBVElPTl9UWVBFICsgJy4nOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19BVVRPID0gR0VORVJBVElPTl9UWVBFXyArICJBVVRPIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFkgPSBHRU5FUkFUSU9OX1RZUEVfICsgIklERU5USVRZIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0UgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlNFUVVFTkNFIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fVEFCTEUgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlRBQkxFIjsKLQotCVN0cmluZyBDQVNDQURFX1RZUEUgPSBQQUNLQUdFXyArICJDYXNjYWRlVHlwZSI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfID0gQ0FTQ0FERV9UWVBFICsgJy4nOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19BTEwgPSBDQVNDQURFX1RZUEVfICsgIkFMTCI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX01FUkdFID0gQ0FTQ0FERV9UWVBFXyArICJNRVJHRSI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX1BFUlNJU1QgPSBDQVNDQURFX1RZUEVfICsgIlBFUlNJU1QiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19SRUZSRVNIID0gQ0FTQ0FERV9UWVBFXyArICJSRUZSRVNIIjsKLQkJU3RyaW5nIENBU0NBREVfVFlQRV9fUkVNT1ZFID0gQ0FTQ0FERV9UWVBFXyArICJSRU1PVkUiOwotCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRSA9IFBBQ0tBR0VfICsgIkRpc2NyaW1pbmF0b3JUeXBlIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV8gPSBESVNDUklNSU5BVE9SX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfX0NIQVIgPSBESVNDUklNSU5BVE9SX1RZUEVfICsgIkNIQVIiOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFX19JTlRFR0VSID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJJTlRFR0VSIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9fU1RSSU5HID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJTVFJJTkciOwotCi0JU3RyaW5nIEVOVU1fVFlQRSA9IFBBQ0tBR0VfICsgIkVudW1UeXBlIjsKLQkJU3RyaW5nIEVOVU1fVFlQRV8gPSBFTlVNX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBFTlVNX1RZUEVfX09SRElOQUwgPSBFTlVNX1RZUEVfICsgIk9SRElOQUwiOwotCQlTdHJpbmcgRU5VTV9UWVBFX19TVFJJTkcgPSBFTlVNX1RZUEVfICsgIlNUUklORyI7Ci0KLQlTdHJpbmcgRkVUQ0hfVFlQRSA9IFBBQ0tBR0VfICsgIkZldGNoVHlwZSI7Ci0JCVN0cmluZyBGRVRDSF9UWVBFXyA9IEZFVENIX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBGRVRDSF9UWVBFX19FQUdFUiA9IEZFVENIX1RZUEVfICsgIkVBR0VSIjsKLQkJU3RyaW5nIEZFVENIX1RZUEVfX0xBWlkgPSBGRVRDSF9UWVBFXyArICJMQVpZIjsKLQotCVN0cmluZyBGTFVTSF9NT0RFX1RZUEUgPSBQQUNLQUdFXyArICJGbHVzaE1vZGVUeXBlIjsKLQkJU3RyaW5nIEZMVVNIX01PREVfVFlQRV8gPSBGTFVTSF9NT0RFX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBGTFVTSF9NT0RFX1RZUEVfX0FVVE8gPSBGTFVTSF9NT0RFX1RZUEVfICsgIkFVVE8iOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFX19DT01NSVQgPSBGTFVTSF9NT0RFX1RZUEVfICsgIkNPTU1JVCI7Ci0KLQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRSA9IFBBQ0tBR0VfICsgIkluaGVyaXRhbmNlVHlwZSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFXyA9IElOSEVSSVRBTkNFX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFX19KT0lORUQgPSBJTkhFUklUQU5DRV9UWVBFXyArICJKT0lORUQiOwotCQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRV9fU0lOR0xFX1RBQkxFID0gSU5IRVJJVEFOQ0VfVFlQRV8gKyAiU0lOR0xFX1RBQkxFIjsKLQkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfX1RBQkxFX1BFUl9DTEFTUyA9IElOSEVSSVRBTkNFX1RZUEVfICsgIlRBQkxFX1BFUl9DTEFTUyI7Ci0KLQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VDb250ZXh0VHlwZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfID0gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFICsgJy4nOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19FWFRFTkRFRCA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiRVhURU5ERUQiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19UUkFOU0FDVElPTiA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiVFJBTlNBQ1RJT04iOwotCi0JU3RyaW5nIFRFTVBPUkFMX1RZUEUgPSBQQUNLQUdFXyArICJUZW1wb3JhbFR5cGUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV8gPSBURU1QT1JBTF9UWVBFICsgJy4nOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fREFURSA9IFRFTVBPUkFMX1RZUEVfICsgIkRBVEUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRSA9IFRFTVBPUkFMX1RZUEVfICsgIlRJTUUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QID0gVEVNUE9SQUxfVFlQRV8gKyAiVElNRVNUQU1QIjsKLQotCS8vIEpQQSBpbnRlcmZhY2VzCi0JU3RyaW5nIEVOVElUWV9NQU5BR0VSID0gUEFDS0FHRV8gKyAiRW50aXR5TWFuYWdlciI7Ci0JU3RyaW5nIEVOVElUWV9NQU5BR0VSX0ZBQ1RPUlkgPSBQQUNLQUdFXyArICJFbnRpdHlNYW5hZ2VyRmFjdG9yeSI7Ci0JU3RyaW5nIEVOVElUWV9UUkFOU0FDVElPTiA9IFBBQ0tBR0VfICsgIkVudGl0eVRyYW5zYWN0aW9uIjsKLQlTdHJpbmcgSU5TVFJVTUVOVEFCTEVfQ0xBU1NfTE9BREVSID0gUEFDS0FHRV8gKyAiSW5zdHJ1bWVudGFibGVDbGFzc0xvYWRlciI7Ci0JU3RyaW5nIFFVRVJZID0gUEFDS0FHRV8gKyAiUXVlcnkiOwotCi0JLy8gSlBBIGNsYXNzZXMKLQlTdHJpbmcgUEVSU0lTVEVOQ0UgPSBQQUNLQUdFXyArICJYbWxQZXJzaXN0ZW5jZSI7Ci0KLQkvLyBKUEEgZXhjZXB0aW9ucwotCVN0cmluZyBOT05fVU5JUVVFX1JFU1VMVF9FWENFUFRJT04gPSBQQUNLQUdFXyArICJOb25VbmlxdWVSZXN1bHRFeGNlcHRpb24iOwotCVN0cmluZyBPQkpFQ1RfTk9UX0ZPVU5EX0VYQ0VQVElPTiA9IFBBQ0tBR0VfICsgIk9iamVjdE5vdEZvdW5kRXhjZXB0aW9uIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfRVhDRVBUSU9OID0gUEFDS0FHRV8gKyAiUGVyc2lzdGVuY2VFeGNlcHRpb24iOwotCi0KLQkvLyAqKioqKioqKioqIFNQSSAqKioqKioqKioqCi0KLQkvLyBKUEEgU1BJIHBhY2thZ2UKLQlTdHJpbmcgU1BJX1BBQ0tBR0UgPSBQQUNLQUdFXyArICJzcGkiOwotCVN0cmluZyBTUElfUEFDS0FHRV8gPSBTUElfUEFDS0FHRSArICcuJzsKLQotCS8vIEpQQSBTUEkgaW50ZXJmYWNlcwotCVN0cmluZyBFTlRJVFlfTUFOQUdFUl9GQUNUT1JZX1BST1ZJREVSID0gU1BJX1BBQ0tBR0VfICsgIkVudGl0eU1hbmFnZXJGYWN0b3J5UHJvdmlkZXIiOwotCVN0cmluZyBQRVJTSVNURU5DRV9JTkZPID0gU1BJX1BBQ0tBR0VfICsgIlBlcnNpc3RlbmNlSW5mbyI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX1BST1ZJREVSID0gU1BJX1BBQ0tBR0VfICsgIlBlcnNpc3RlbmNlUHJvdmlkZXIiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9KcHRHZW5NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvSnB0R2VuTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3MDVkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9KcHRHZW5NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBlbnRpdHkgZ2VuZXJhdGlvbi4KLSAqLwotY2xhc3MgSnB0R2VuTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5TY29wZV90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmF0b3JfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVtcGxhdGVzX25vdEZvdW5kOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9nZW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0R2VuTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRHZW5NZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9NYW55VG9NYW55UmVsYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBjOWFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBpcyBzaGFyZWQgYnkgdGhlIHR3byBnZW4gdGFibGVzIHRoYXQgbWFrZSB1cCB0aGUgcmVsYXRpb24uCi0gKiBVcG9uIGNvbnN0cnVjdGlvbiwgJ21hcHBlZEJ5JyB3aWxsIGJlICdudWxsJy4gVGhlIGZpcnN0IGdlbiB0YWJsZSB0byBiZQotICogdXNlZCB0byBnZW5lcmF0ZSBhbiBlbnRpdHkgd2lsbCBmaWxsIGluICdtYXBwZWRCeScgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLSAqIGF0dHJpYnV0ZSAoZmllbGQvcHJvcGVydHkpIG5hbWUuCi0gKi8KLWNsYXNzIE1hbnlUb01hbnlSZWxhdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBqb2luR2VuVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGb3JlaWduS2V5IG93bmluZ0ZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBvd25pbmdHZW5UYWJsZTsKLQlwcml2YXRlIGZpbmFsIEZvcmVpZ25LZXkgbm9uT3duaW5nRm9yZWlnbktleTsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIG5vbk93bmluZ0dlblRhYmxlOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OyAgLy8gc2V0IHdoaWxlIGdlbmVyYXRpbmcgZW50aXRpZXMKLQotCi0JTWFueVRvTWFueVJlbGF0aW9uKAotCQkJR2VuVGFibGUgam9pbkdlblRhYmxlLAotCQkJRm9yZWlnbktleSBvd25pbmdGb3JlaWduS2V5LAotCQkJR2VuVGFibGUgb3duaW5nR2VuVGFibGUsCi0JCQlGb3JlaWduS2V5IG5vbk93bmluZ0ZvcmVpZ25LZXksCi0JCQlHZW5UYWJsZSBub25Pd25pbmdHZW5UYWJsZQotCSkgewotCQlzdXBlcigpOwotCQl0aGlzLmpvaW5HZW5UYWJsZSA9IGpvaW5HZW5UYWJsZTsKLQotCQl0aGlzLm93bmluZ0ZvcmVpZ25LZXkgPSBvd25pbmdGb3JlaWduS2V5OwotCQl0aGlzLm93bmluZ0dlblRhYmxlID0gb3duaW5nR2VuVGFibGU7Ci0JCW93bmluZ0dlblRhYmxlLmFkZE93bmVkTWFueVRvTWFueVJlbGF0aW9uKHRoaXMpOwotCi0JCXRoaXMubm9uT3duaW5nRm9yZWlnbktleSA9IG5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JCXRoaXMubm9uT3duaW5nR2VuVGFibGUgPSBub25Pd25pbmdHZW5UYWJsZTsKLQkJbm9uT3duaW5nR2VuVGFibGUuYWRkTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Sm9pbkdlblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luR2VuVGFibGU7Ci0JfQotCi0JRm9yZWlnbktleSBnZXRPd25pbmdGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdGb3JlaWduS2V5OwotCX0KLQotCUdlblRhYmxlIGdldE93bmluZ0dlblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdHZW5UYWJsZTsKLQl9Ci0KLQlGb3JlaWduS2V5IGdldE5vbk93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Tm9uT3duaW5nR2VuVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0dlblRhYmxlOwotCX0KLQotCVN0cmluZyBnZXRPd25lZEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0dlblRhYmxlLmdldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JU3RyaW5nIGdldE5vbk93bmVkQXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duaW5nR2VuVGFibGUuZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgc2NvcGUgY2xlYXJzIHRoZSBqb2luIHRhYmxlIHJlbGF0aW9uIGlmIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSBqb2luIHRhYmxlCi0JICovCi0Jdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5vd25pbmdHZW5UYWJsZS5yZW1vdmVPd25lZE1hbnlUb01hbnlSZWxhdGlvbih0aGlzKTsKLQkJdGhpcy5ub25Pd25pbmdHZW5UYWJsZS5yZW1vdmVOb25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbih0aGlzKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKLQl9Ci0KLQlTdHJpbmcgZ2V0T3duaW5nRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duaW5nR2VuVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCVN0cmluZyBnZXROb25Pd25pbmdFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25pbmdHZW5UYWJsZS5nZXRFbnRpdHlOYW1lKCk7Ci0JfQotCi0JYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5qb2luR2VuVGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuam9pbkdlblRhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdmYjg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL01hbnlUb09uZVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwub2xkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgaGVsZCBieSB0aGUgImJhc2UiIGdlbiB0YWJsZSBhbmQsIGluZGlyZWN0bHkgdmlhIGEKLSAqIG9uZS10by1tYW55IHJlbGF0aW9uLCB0aGUgInJlZmVyZW5jZWQiIGdlbiB0YWJsZS4KLSAqIFRoZSAibWFwcGVkIGJ5IiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KSBuYW1lIGlzIHNldCB3aGlsZSB0aGUKLSAqICJiYXNlIiB0YWJsZSBpcyBjYWxjdWxhdGluZyBpdHMgYXR0cmlidXRlIG5hbWVzLgotICovCi1jbGFzcyBNYW55VG9PbmVSZWxhdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBiYXNlR2VuVGFibGU7ICAvLyB0aGUgIm1hbnkiIHNpZGUgKGUuZy4gRGV0YWlsKQotCXByaXZhdGUgZmluYWwgRm9yZWlnbktleSBmb3JlaWduS2V5OwotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgcmVmZXJlbmNlZEdlblRhYmxlOyAgLy8gdGhlICJvbmUiIHNpZGUgKGUuZy4gTWFzdGVyKQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OyAgLy8gc2V0IHdoaWxlIGdlbmVyYXRpbmcgZW50aXRpZXM7IHVzZWQgYnkgcGFydG5lciBvbmUtdG8tbWFueSByZWxhdGlvbgotCi0KLQlNYW55VG9PbmVSZWxhdGlvbigKLQkJCUdlblRhYmxlIGJhc2VHZW5UYWJsZSwKLQkJCUZvcmVpZ25LZXkgZm9yZWlnbktleSwKLQkJCUdlblRhYmxlIHJlZmVyZW5jZWRHZW5UYWJsZQotCSkgewotCQlzdXBlcigpOwotCQl0aGlzLmJhc2VHZW5UYWJsZSA9IGJhc2VHZW5UYWJsZTsKLQkJdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJdGhpcy5yZWZlcmVuY2VkR2VuVGFibGUgPSByZWZlcmVuY2VkR2VuVGFibGU7Ci0JCXJlZmVyZW5jZWRHZW5UYWJsZS5hZGRPbmVUb01hbnlSZWxhdGlvbihuZXcgT25lVG9NYW55UmVsYXRpb24odGhpcykpOwotCX0KLQotCUdlblRhYmxlIGdldEJhc2VHZW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZUdlblRhYmxlOwotCX0KLQotCUZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleTsKLQl9Ci0KLQlHZW5UYWJsZSBnZXRSZWZlcmVuY2VkR2VuVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRHZW5UYWJsZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleS5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIGdldEJhc2VFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlR2VuVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCVN0cmluZyBnZXRSZWZlcmVuY2VkRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZEdlblRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0QmFzZUdlblRhYmxlQ29sbGVjdGlvbkF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmJhc2VHZW5UYWJsZS5nZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZm9yZWlnbktleSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9PbmVUb01hbnlSZWxhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvT25lVG9NYW55UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMDcwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL29sZC9PbmVUb01hbnlSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIG1hbnktdG8tb25lIHJlbGF0aW9uLgotICovCi1jbGFzcyBPbmVUb01hbnlSZWxhdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBNYW55VG9PbmVSZWxhdGlvbiBtYW55VG9PbmVSZWxhdGlvbjsKLQotCi0JT25lVG9NYW55UmVsYXRpb24oTWFueVRvT25lUmVsYXRpb24gbWFueVRvT25lUmVsYXRpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tYW55VG9PbmVSZWxhdGlvbiA9IG1hbnlUb09uZVJlbGF0aW9uOwotCX0KLQotCU1hbnlUb09uZVJlbGF0aW9uIGdldE1hbnlUb09uZVJlbGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uZ2V0QmFzZUdlblRhYmxlQ29sbGVjdGlvbkF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uLmdldE1hcHBlZEJ5KCk7Ci0JfQotCi0JU3RyaW5nIGdldFJlZmVyZW5jZWRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbi5nZXRCYXNlRW50aXR5TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubWFueVRvT25lUmVsYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvUGFja2FnZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9vbGQvUGFja2FnZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzc2YmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvb2xkL1BhY2thZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwub2xkOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBwYWNrYWdlIG9mIGVudGl0aWVzIGZvciBhIHNldCBvZiB0YWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlR2VuZXJhdG9yIHsKLQlwcml2YXRlIGZpbmFsIENvbmZpZyBjb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIEdlblNjb3BlIHNjb3BlOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRW50aXRpZXMoCi0JCQlDb25maWcgY29uZmlnLAotCQkJRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcgotCSkgewotCQlpZiAoKGNvbmZpZyA9PSBudWxsKSB8fCAoZW50aXR5Q29uZmlnID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KHByb2dyZXNzTW9uaXRvciwgSnB0R2VuTWVzc2FnZXMuUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZSwgMTAwKTsKLQkJbmV3IFBhY2thZ2VHZW5lcmF0b3IoY29uZmlnLCBlbnRpdHlDb25maWcsIHNtLm5ld0NoaWxkKDEwKSkuZ2VuZXJhdGVFbnRpdGllcyhzbS5uZXdDaGlsZCg5MCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQYWNrYWdlR2VuZXJhdG9yKAotCQkJQ29uZmlnIGNvbmZpZywKLQkJCUVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IKLQkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOwotCQl0aGlzLnNjb3BlID0gbmV3IEdlblNjb3BlKGVudGl0eUNvbmZpZywgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdGllcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KHByb2dyZXNzTW9uaXRvciwgdGhpcy5zY29wZS5lbnRpdHlUYWJsZXNTaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLnNjb3BlLmVudGl0eUdlblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY2hlY2tDYW5jZWxlZChzbSk7Ci0JCQl0aGlzLmdlbmVyYXRlRW50aXR5KHN0cmVhbS5uZXh0KCksIHNtLm5ld0NoaWxkKDEpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0eShHZW5UYWJsZSBnZW5UYWJsZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRW50aXR5R2VuZXJhdG9yLmdlbmVyYXRlRW50aXR5KAotCQkJCXRoaXMuZW50aXR5Q29uZmlnLAotCQkJCXRoaXMuY29uZmlnLmdldFBhY2thZ2VGcmFnbWVudCgpLAotCQkJCWdlblRhYmxlLAotCQkJCXByb2dyZXNzTW9uaXRvcgotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWlmIChwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc2NvcGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWcgewotCQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50OwotCi0JCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnQ7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0NvbXBpbGF0aW9uVW5pdE1vZGlmaWVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2ZjAxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgZ3J1bnQgd29yayBuZWVkZWQgZm9yIG1vZGlmeWluZyBhIGNvbXBpbGF0aW9uIAotICogdW5pdCBhbmQgcGVyZm9ybXMgdGhlIG1vZGlmaWVkIGNvbXBpbGF0aW9uIHVuaXQgc2F2ZS4KLSAqIAotICogVGhlIHR5cGljYWwgdXNhZ2UgaXMgYXMgZm9sbG93czoKLSAqIDxvbD48bGk+Q3JlYXRlIGFuIGluc3RhbmNlLgotICogCi0gKiA8bGk+TW9kaWZ5IHRoZSBjb21waWxhdGlvbiB1bml0IHVzaW5nIEFTVCBvcGVyYXRpb25zIHBlcmZvcm1lZCAKLSAqIAlvbiB0aGUgbm9kZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldENvbXBpbGF0aW9uVW5pdE5vZGUoKX0uCi0gKiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNhbGwgPGNvZGU+c2V0SmF2YVNvdXJjZTwvY29kZT4gdG8gY2hhbmdlIHRoZSBlbnRpcmUgc291cmNlIGNvZGUuIAotICogCi0gKiA8bGk+Q2FsbCB0aGUge0BsaW5rICNzYXZlKCl9IG1ldGhvZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIKLXsKLQlwcml2YXRlIElKYXZhUHJvamVjdCBtUHJvamVjdDsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgbUNvbXBpbGF0aW9uVW5pdDsKLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBtQ29tcGlsYXRpb25Vbml0Tm9kZTsKLQlwcml2YXRlIERvY3VtZW50IG1Eb2N1bWVudDsKLQkKLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQkKLQkJbVByb2plY3QgPSBwcm9qZWN0OwotCQkKLQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIGNsYXNzICIgKyBjbGFzc05hbWUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotCQl9Ci0JCW1Db21waWxhdGlvblVuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAobUNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc291cmNlIGNvZGUgZm9yICIgKyBjbGFzc05hbWUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotCQl9Ci0JfQotCXB1YmxpYyBDb21waWxhdGlvblVuaXRNb2RpZmllcihJSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltUHJvamVjdCA9IHByb2plY3Q7Ci0JCW1Db21waWxhdGlvblVuaXQgPSBjdTsKLQl9Ci0JcHVibGljIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ29tcGlsYXRpb25Vbml0IGN1LCBDb21waWxhdGlvblVuaXQgY3VOb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Qcm9qZWN0ID0gcHJvamVjdDsKLQkJbUNvbXBpbGF0aW9uVW5pdCA9IGN1OwotCQltQ29tcGlsYXRpb25Vbml0Tm9kZSA9IGN1Tm9kZTsKLQkJCi0JCWdldENvbXBpbGF0aW9uVW5pdE5vZGUoKTsgLy90byBjcmVhdGUgbURvY3VtZW50ICh0aGUgY2FsbGVyIGluIHRoaXMgY2FzZSBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgZ2V0Q29tcGlsYXRpb25Vbml0Tm9kZSkKLQl9Ci0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gbUNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCBub2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIAotCSAqIHR5aGUgbW9kaWZpY2F0aW9uIEFTVCBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0Tm9kZSgpIHsKLQkJaWYgKG1Db21waWxhdGlvblVuaXROb2RlID09IG51bGwpIHsKLQkJCUFTVFBhcnNlciBjID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCQljLnNldFNvdXJjZShtQ29tcGlsYXRpb25Vbml0KTsKLQkJCWMuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUgPSAoQ29tcGlsYXRpb25Vbml0KWMuY3JlYXRlQVNUKG51bGwpOwotCQl9Ci0JCWlmIChtRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQobUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCQotCQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUucmVjb3JkTW9kaWZpY2F0aW9ucygpOwotCQl9Ci0JCQotCQlyZXR1cm4gbUNvbXBpbGF0aW9uVW5pdE5vZGU7Ci0JfQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGVudGlyZSBKYXZhIHNvdXJjZSBjb2RlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2UoU3RyaW5nIG5ld1NvdXJjZSkgewotCQl0cnkgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhuZXdTb3VyY2UpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBtb2RpZmljYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG1Db21waWxhdGlvblVuaXROb2RlICE9IG51bGwpIHsKLQkJCWFzc2VydChtRG9jdW1lbnQgIT0gbnVsbCk7IC8vc2VlIGdldENvbXBpbGF0aW9uVW5pdE5vZGUKLQkJCQotCQkJLy9jb21wdXRhdGlvbiBvZiB0aGUgdGV4dCBlZGl0cwotCQkJVGV4dEVkaXQgZWRpdHMgPSBtQ29tcGlsYXRpb25Vbml0Tm9kZS5yZXdyaXRlKG1Eb2N1bWVudCwgbVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQkvL2NvbXB1dGF0aW9uIG9mIHRoZSBuZXcgc291cmNlIGNvZGUKLQkJCWVkaXRzLmFwcGx5KG1Eb2N1bWVudCk7Ci0JCQlTdHJpbmcgbmV3U291cmNlID0gbURvY3VtZW50LmdldCgpOwotCQkJLy8gdXBkYXRlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JCQltQ29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKG5ld1NvdXJjZSk7Ci0JCX0KLQkJCi0JCWlmIChtQ29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSkgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5jb21taXRXb3JraW5nQ29weSh0cnVlLypmb3JjZSovLCBudWxsLyptb25pdG9yKi8pOwotCQl9IGVsc2UgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5zYXZlKG51bGwvKm1vbml0b3IqLywgdHJ1ZS8qZm9yY2UqLyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRFRQVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0RUUFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5NzE2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvRFRQVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXkuQ29sdW1uUGFpcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byBhY2Nlc3MgRFRQIGFuZCBvdGhlciBqcHQuZGIgQVBJcyAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9JbmNyZW1lbnQoQ29sdW1uIGMpewotCQkvL0AgVE9ETwotCQkvL0Jsb2NrZWQgYnkgRFRQIGJ1ZwotCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTAwMjMKLQkJLy9UaGUgRGFsaSBidWcgaXMKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NjU4Ci0JCS8vCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBmawotCSAqIEBwYXJhbSBkYlRhYmxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxGb3JlaWduS2V5SW5mbz4gZ2V0Rm9yZWlnbktleXMoVGFibGUgZGJUYWJsZSkgewotCQlMaXN0PEZvcmVpZ25LZXlJbmZvPiByZXQgPSBuZXcgQXJyYXlMaXN0PEZvcmVpZ25LZXlJbmZvPigpOwotCQlpZihkYlRhYmxlIT1udWxsKXsKLQkJCUl0ZXJhdG9yPEZvcmVpZ25LZXk+IGZrcyA9IGRiVGFibGUuZm9yZWlnbktleXMoKTsKLQkJCXdoaWxlKCBma3MuaGFzTmV4dCgpICl7Ci0JCQkJRm9yZWlnbktleSBmayAgPSBma3MubmV4dCgpOwotCQkJCUl0ZXJhdG9yPENvbHVtblBhaXI+IGNvbHVtblBhaXJlcyA9IGZrLmNvbHVtblBhaXJzKCk7Ci0JCQkJRm9yZWlnbktleUluZm8gZmtJbmZvID0gbnVsbDsKLQkJCQl3aGlsZSggY29sdW1uUGFpcmVzLmhhc05leHQoKSApewotCQkJCQlDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSBjb2x1bW5QYWlyZXMubmV4dCgpOwotCQkJCQlpZiggZmtJbmZvID09IG51bGwpewotCQkJCQkJU3RyaW5nIHRhYmxlTmFtZSA9IGRiVGFibGUuZ2V0TmFtZSgpOwotCQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUgPSAiIjsKLQkJCQkJCVRhYmxlIHJlZmVyZW5jZWRUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQkJCQkJcmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZS5nZXROYW1lKCk7Ci0JCQkJCQlma0luZm8gPSBuZXcgRm9yZWlnbktleUluZm8oZmssIHRhYmxlTmFtZSwgcmVmZXJlbmNlZFRhYmxlTmFtZSApOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2xOYW1lID0gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCQlma0luZm8uYWRkQ29sdW1uTWFwcGluZyggYmFzZUNvbE5hbWUsICByZWZlcmVuY2VkQ29sTmFtZSApOwotCQkJCX0gCi0JCQkJaWYoIGZrSW5mbyAhPW51bGwgKQotCQkJCQlyZXQuYWRkKCBma0luZm8gKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFUeXBlKENvbHVtbiBkYkNvbHVtbikgewotCQlyZXR1cm4gZGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgPwotCQkJCWRiQ29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCkgOgotCQkJCWRiQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0U2NoZW1hKFRhYmxlIGRiVGFibGUpewotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IGRiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0TmFtZSgpOwotCQlTY2hlbWEgZGVmYXVsdFNjaGVtYSA9IGRiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJcmV0dXJuIGRlZmF1bHRTY2hlbWEuZ2V0TmFtZSgpID09IHNjaGVtYU5hbWU7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExN2NhODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29sbGVjdGlvbnMgb2YgdXRpbGl0eSBtZXRob2RzIGhhbmRsaW5nIGZpbGVzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbAotewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUxFVEVfRk9MREVSX0VSUiA9ICJUaGUgZGlyZWN0b3J5ICVzIGNvdWxkIG5vdCBiZSBkZWxldGVkLiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFTEVURV9GSUxFX0VSUiA9ICJUaGUgZmlsZSAlcyBjb3VsZCBub3QgYmUgZGVsZXRlZC4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBGSUxFX1JFQURPTkxZX0VSUiA9ICJUaGUgZmlsZSAlcyBjb3VsZCBub3QgYmUgbW9kaWZpZWQgYmVjYXVzZSB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkLlxuUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBtYXJrZWQgYXMgcmVhZG9ubHkgaW4gdGhlIGZpbGUgc3lzdGVtLiI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRm9sZGVyKEZpbGUgZm9sZGVyKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVbXSBmaWxlcyA9IGZvbGRlci5saXN0RmlsZXMoKTsKLQkJLy9lbXB0eSB0aGUgZm9sZGVyIGZpcnN0IChqYXZhLmlvLmZpbGUuZGVsZXRlIHJlcXVpcmVzIGl0IGVtcHR5KQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotCQkJCUZpbGUgZiA9IGZpbGVzW2ldOwotCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpCi0JCQkJCWRlbGV0ZUZvbGRlcihmKTsKLQkJCQllbHNlCi0JCQkJCWRlbGV0ZVBhdGgoZik7Ci0JCQl9Ci0JCX0KLQkJZGVsZXRlUGF0aChmb2xkZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQYXRoKEZpbGUgZikKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlpZiAoIWYuZGVsZXRlKCkpIHsKLQkJCVN0cmluZyBtc2dJZCA9IGYuaXNEaXJlY3RvcnkoKSA/ICBERUxFVEVfRk9MREVSX0VSUiA6ICBERUxFVEVfRklMRV9FUlI7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIFN0cmluZy5mb3JtYXQobXNnSWQsZi5nZXRQYXRoKCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShGaWxlIHNyYykKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJdHJ5IHsKLQkJCWxvbmcgZmlsZUxlbiA9IHNyYy5sZW5ndGgoKTsKLQkJCWlmIChmaWxlTGVuID4gSW50ZWdlci5NQVhfVkFMVUUpCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmaWxlIGxlbmd0aCB0b28gYmlnIHRvIGJlIHJlYWQgYnkgRmlsZVV0aWwucmVhZEZpbGU6ICIgKyBmaWxlTGVuKTsKLQkJCi0JCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KWZpbGVMZW5dOwotCQkJZmluLnJlYWQoYnl0ZXMpOwotCQkJcmV0dXJuIGJ5dGVzOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZmluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWxlKEZpbGUgZGVzdCwgYnl0ZVtdIGJ5dGVzKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmIChkZXN0LmV4aXN0cygpICYmICFkZXN0LmNhbldyaXRlKCkpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIEZJTEVfUkVBRE9OTFlfRVJSICk7ICAvL3Rocm93IHdpdGggYSBjbGVhciBlcnJvciBiZWNhdXNlIG90aGVyd2lzZSBGaWxlT3V0cHV0U3RyZWFtIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24hCi0JCWphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShkZXN0LmdldFBhdGgoKSwgZmFsc2UvKmFwcGVuZCovKTsKLQkJdHJ5IHsKLQkJCWZvdXQud3JpdGUoYnl0ZXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZm91dC5mbHVzaCgpOwotCQkJZm91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsIGZvciBhIGZpbGUuCi0JICogVGhpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgZmlsZS50b1VybCgpIGJ1dCB3aXRob3V0IHRoZSBub24tc2Vuc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEZpbGVVcmwoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmlsZS50b1VSSSgpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy9zaG91bGQgbm90IGhhcHBlbiBhcyBmaWxlLnRvVVJMKCkgZG9lcyBub3QgcmVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbgotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVDb250ZW50KEZpbGUgZmlsZSwgamF2YS5pby5JbnB1dFN0cmVhbSBjb250ZW50cykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJ5IHsKLQkJCUlGaWxlIGlGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoaUZpbGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIHBhdGggIiArIGZpbGUgKyAiIGRvZXMgbm90IHNlZW0gdG8gYmUgYSB2YWxpZCBmaWxlIHBhdGguIik7Ci0JCQl9Ci0JCQlpRmlsZS5zZXRDb250ZW50cyhjb250ZW50cywgdHJ1ZS8qZm9yY2UqLywgdHJ1ZS8qa2VlcEhpc3RvcnkqLywgbnVsbC8qbW9uaXRvciovKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CQotCQotICAgIC8qKgotICAgICAqIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIGEgSmFyIGFyY2hpdmUgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5qYXIoSW5wdXRTdHJlYW0gaW4sIEZpbGUgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFkZXN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBkZXN0Lm1rZGlycygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZGVzdC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlc3RpbmF0aW9uIG11c3QgYmUgYSBkaXJlY3RvcnkuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIEphcklucHV0U3RyZWFtIGppbiA9IG5ldyBKYXJJbnB1dFN0cmVhbShpbik7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQotICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IGppbi5nZXROZXh0RW50cnkoKTsKLSAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5jaGFyQXQoZmlsZU5hbWUubGVuZ3RoKCkgLSAxKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmNoYXJBdCgwKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3QsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0gICAgICAgICAgICAgICAgZmlsZS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICBqaW4uY2xvc2VFbnRyeSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKLSAgICAgICAgICAgICAgICBGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBkdW1wIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gamluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgamluLmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgICAgICBmaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkgPSBqaW4uZ2V0TmV4dEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRXhwbGljaXRseSB3cml0ZSBvdXQgdGhlIE1FVEEtSU5GL01BTklGRVNULk1GIHNvIHRoYXQgYW55IGhlYWRlcnMgc3VjaAotICAgICAgICAgYXMgdGhlIENsYXNzLVBhdGggYXJlIHNlZW4gZm9yIHRoZSB1bnBhY2thZ2VkIGphcgotICAgICAgICAgKi8KLSAgICAgICAgTWFuaWZlc3QgbWYgPSBqaW4uZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgaWYgKG1mICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3QsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgbWYud3JpdGUob3V0KTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgamluLmNsb3NlKCk7Ci0gICAgfQotICAgIAotCS8vVXNlZCB0byBVbnppcCB0aGUgYSBzcGVjaWZpYyBmb2xkZXIgcGFja2VkIGluc2lkZSBhIHBsdWctaW4gYnVuZGxlIHRvIHRoZSBwbHVnLWluIHN0YXRlIGxvY2F0aW9uCi0JcHVibGljIHN0YXRpYyBGaWxlIGV4dHJhY3RGaWxlc0Zyb21CdW5kbGUoIFVSTCB1cmwsIEJ1bmRsZSBidW5kbGUsIFN0cmluZyBwYXRoICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCBqYXJVcmwgPSBVcmxVdGlsLmdldEphckZpbGVVcmwodXJsKTsKLQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoamFyVXJsLmdldEZpbGUoKSApOwotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IFBsYXRmb3JtLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCUZpbGUgY29uZmlnRm9sZGVyID0gbmV3IEZpbGUoIGNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpLmdldEZpbGUoKSwgcGx1Z2luSWQpOwotCQlGaWxlIHRlbXBsRGlyID0gbmV3IEZpbGUoIGNvbmZpZ0ZvbGRlciwgcGF0aCApOwotCQlpZiggIXRlbXBsRGlyLmV4aXN0cygpICl7Ci0JCQlGaWxlVXRpbC51bmphciggbmV3IEZpbGVJbnB1dFN0cmVhbSggamFyRmlsZSApLCBjb25maWdGb2xkZXIgKTsKLQkJCS8vRGVsZXRlIHVuLXJlbGF0ZWQgZmlsZXMgYW5kIGZvbGRlcnMKLQkJCUZpbGVbXSBmaWxlcyA9IGNvbmZpZ0ZvbGRlci5saXN0RmlsZXMoKTsKLQkJCWZvciggRmlsZSBmIDogZmlsZXMgKXsKLQkJCQlpZiggZi5pc0ZpbGUoKSApCi0JCQkJCWYuZGVsZXRlKCk7Ci0JCQkJZWxzZSBpZiggIHRlbXBsRGlyLmdldFBhdGgoKS5pbmRleE9mKCBmLmdldFBhdGgoKSApICE9MCAgKXsKLQkJCQkJRmlsZVV0aWwuZGVsZXRlRm9sZGVyKGYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGVtcGxEaXIgOwotCX0JCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9Gb3JlaWduS2V5SW5mby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0ZvcmVpZ25LZXlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTkxZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL0ZvcmVpZ25LZXlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIG1ldGFkYXRhIGZvciBhIHBhcnRpY3VsYXIgZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwIAotICogaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHNjaGVtYS4KLSAqIDxwLz4KLSAqIFRoZSByZWZlcnJlciBjb2x1bW4gaXMgb25lIHdoaWNoIGFjdHVhbGx5IGNvbnRhaW5zIGEgZm9yZWlnbiAKLSAqIGtleSBjb25zdHJhaW50LCBhbmQgaXMgZXF1aXZhbGVudCB0byB0aGUgImZvcmVpZ24ga2V5IiBjb2x1bW4uCi0gKiA8cC8+Ci0gKiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgb25lIHdoaWNoIGEgcmVmZXJyZXIgb3IgZm9yZWlnbiBrZXkgCi0gKiBjb2x1bW4gcmVmZXJlbmNlcywgYW5kIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJwcmltYXJ5IGtleSIgY29sdW1uLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JlaWduS2V5SW5mbwotewotCXByaXZhdGUgdHJhbnNpZW50IEZvcmVpZ25LZXkgbUZvcmVpZ25LZXkgOwotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1SZWZlcnJlclRhYmxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUmVmZXJlbmNlZFRhYmxlTmFtZTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJyZXJDb2xOYW1lcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJlbmNlZENvbE5hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBmayBUaGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCBiYWNraW5nIAotICAgICAqIHRoaXMgZm9yZWlnbiBrZXkgbWV0YWRhdGEgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEZvcmVpZ25LZXlJbmZvKEZvcmVpZ25LZXkgZmssIFN0cmluZyByZWZlcnJlclRhYmxlTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUpIHsKLSAgICAJbUZvcmVpZ25LZXkgPSBmazsKLSAgICAJbU5hbWUgPSBmay5nZXROYW1lKCk7Ci0gICAgCW1SZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVycmVyVGFibGVOYW1lOwotICAgIAltUmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JfQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUgY29uc3RyYWludCBuYW1lIGZvciB0aGlzIGZvcmVpZ24ga2V5IHNwZWNpZmljYXRpb24uCi0gICAgICogVGhlIG5hbWUgZm9yIGEgRm9yZWlnbiBLZXkgbWF5LCBhcyBwZXIgdGhlIEpEQkMgc3BlY2lmaWNhdGlvbiwKLSAgICAgKiBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGVyZSB0aGUgY29uc3RyYWludCBpcyBub3QgbmFtZWQuCi0gICAgICogSW4gYWRkaXRpb24sIGl0IG1heSBiZSBoYXJkbHkgcmVjb2duaXphYmxlIHRvIHRoZSB1c2VyLAotICAgICAqIHBhcnRpY3VsYXJseSBmb3IgREIvMiBjb25zdHJhaW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50IGJhY2tpbmcKLSAgICAgKiAgICAgICAgIHRoaXMgZm9yZWlnbiBrZXkgbWV0YWRhdGEgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpewotICAgIAlyZXR1cm4gbUZvcmVpZ25LZXk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEFkZCBhbm90aGVyIHBhaXIgb2YgZm9yZWlnbiBrZXkgbWFwcGluZ3MgZm9yIHRoaXMgZm9yZWlnbiBrZXkKLSAgICAgKiBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWZlcnJlckNvbHVtbiBUaGUgcmVmZXJyZXIgY29sdW1uIG5hbWUgZm9yIHRoaXMgbWFwcGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlZENvbHVtbiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbHVtbk1hcHBpbmcoU3RyaW5nIHJlZmVycmVyQ29sTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRDb2xOYW1lKSB7Ci0gICAgCW1SZWZlcnJlckNvbE5hbWVzLmFkZChyZWZlcnJlckNvbE5hbWUpOwotICAgIAltUmVmZXJlbmNlZENvbE5hbWVzLmFkZChyZWZlcmVuY2VkQ29sTmFtZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVycmVyIHRhYmxlIG5hbWUgb2YgdGhpcyBmb3JlaWduIGtleQotICAgICAqIHJlbGF0aW9uc2hpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVycmVyVGFibGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVJlZmVycmVyVGFibGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcnJlciBjb2x1bW4gbmFtZXMgZm9yIHRoaXMKLSAgICAgKiBmb3JlaWduIGtleS4KLSAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGxpc3QgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBzaXplIG9mIAotICAgICAqIHRoZSBsaXN0IHJldHVyZWQgZnJvbSA8Y29kZT5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXM8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgewotICAgICAgICByZXR1cm4gbVJlZmVycmVyQ29sTmFtZXM7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgdGFibGUgbmFtZSBvZiB0aGlzIGZvcmVpZ24ga2V5Ci0gICAgICogcmVsYXRpb25zaGlwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIHsKLSAgICAJIHJldHVybiBtUmVmZXJlbmNlZFRhYmxlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZXMgZm9yIHRoaXMKLSAgICAgKiBmb3JlaWduIGtleS4KLSAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGxpc3QgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBzaXplIG9mIAotICAgICAqIHRoZSBsaXN0IHJldHVyZWQgZnJvbSA8Y29kZT5nZXRSZWZlcnJlckNvbHVtbk5hbWVzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkgewotICAgICAgICByZXR1cm4gbVJlZmVyZW5jZWRDb2xOYW1lczsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAJcmV0dXJuICJuYW1lPSIgKyBtTmFtZQotCQkrICIsIHJlZmVycmVyVGFibGU9IiArIG1SZWZlcnJlclRhYmxlTmFtZQotCQkrICIsIHJlZmVyZW5jZWRUYWJsZT0iICsgbVJlZmVyZW5jZWRUYWJsZU5hbWUKLQkJKyAiLCByZWZlcnJlckNvbHVtbnM9IiArIG1SZWZlcnJlckNvbE5hbWVzCi0JCSsgIiwgcmVmZXJlbmNlZENvbHVtbnM9IiArIG1SZWZlcmVuY2VkQ29sTmFtZXMKLQkJCTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9TdHJpbmdVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL3V0aWwvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTQ1ZTA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9TdHJpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdVdGlsCi17Ci0JLyoqCi0JICogUGFkcyBhIHN0cmluZyBieSBhZGRpbmcgYSBzZXF1ZW5jZSBvZiBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcuCi0JICogQHBhcmFtIHBhZENoYXIgVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIGZvciBwYWRkaW5nLgotCSAqIEBwYXJhbSBsZW4gVGhlIGRlc2lyZWQgbGVuZ3RoIGFmdGVyIHBhZGRpbmcuCi0JICogQHJldHVybiBUaGUgcGFkZGVkIHN0cmluZy4gRm9yIGV4YW1wbGUgaWYgPGNvZGU+c3RyPC9jb2RlPiBpcyAiZjRlIiBhbmQgPGNvZGU+cGFkQ2hhcjwvY29kZT4gaXMgJzAnIAotCSAqIGFuZCA8Y29kZT5sZW48L2NvZGU+IGlzIDYgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zICIwMDBmNGUiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkTGVmdChTdHJpbmcgc3RyLCBjaGFyIHBhZENoYXIsIGludCBsZW4pIHsKLQkJaWYoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBzdHJMZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWlmIChzdHJMZW4gPCBsZW4pIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCQlpbnQgY291bnQgPSBsZW4tc3RyTGVuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQkJCWJ1ZmZlci5hcHBlbmQocGFkQ2hhcik7Ci0JCQlidWZmZXIuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQkvKioKLQkgKiBJbnNlcnRzIGEgZ2l2ZW4gY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogRm9yIGV4YW1wbGUgaWYgdGhlIHN0cmluZyBpcyA8dHQ+ZXh0cmVtZTwvdHQ+IGFuZCB0aGUgY2hhciBpcyA8dHQ+JzwvdHQ+IHRoZW4gCi0JICogdGhlIHJldHVybmVkIHN0cmluZyBpcyA8dHQ+J2V4dGVybWUnPC90dD4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0ciwgY2hhciBjKSB7Ci0JCWFzc2VydChzdHIgIT0gbnVsbCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0ci5sZW5ndGgoKSsyKTsKLQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJYnVmZmVyLmFwcGVuZChzdHIpOwotCQlidWZmZXIuYXBwZW5kKGMpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvdWJsZVF1b3RlKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHF1b3RlKHN0ciwgJyInKTsKLQl9Ci0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZmlyc3QgYW5kIGxhc3Qgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKGlmIHRoZXkgZXhpc3QpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucXVvdGUoU3RyaW5nIHF1b3RlZCkgewotCQlpZiAocXVvdGVkICE9IG51bGwgJiYgcXVvdGVkLmxlbmd0aCgpID49IDIpewotCQkJaW50IGxlbiA9IHF1b3RlZC5sZW5ndGgoKTsKLQkJCWNoYXIgZmlyc3RDaGFyID0gcXVvdGVkLmNoYXJBdCgwKTsKLQkJCWNoYXIgbGFzdENoYXIgPSBxdW90ZWQuY2hhckF0KGxlbi0xKTsKLQkJCWlmIChmaXJzdENoYXIgPT0gbGFzdENoYXIgJiYgKGZpcnN0Q2hhciA9PSAnXCcnIHx8IGZpcnN0Q2hhciA9PSAnIicpKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZC5zdWJzdHJpbmcoMSwgbGVuLTEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdW90ZWQ7Ci0JfQotCS8qKgotCSAqIFRydW5jYXRlcyBhIHN0cmluZyBhbmQgYWRkcyAiLi4uIiBpbiB0aGUgcmVzdWx0IHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsZXNzIG9yIGVxdWFsIHRvIHRoZSBtYXggbGVuIHRoZW4gCi0JICogdGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cnVuY2F0ZShTdHJpbmcgcywgaW50IG1heExlbikgewotCQlpZiAocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IG1heExlbikgewotCQkJaW50IHNlZ21lbnRMZW4gPSBtYXhMZW4vMjsKLQkJCXMgPSBzLnN1YnN0cmluZygwLCBzZWdtZW50TGVuKSArICIuLi4iICsgcy5zdWJzdHJpbmcobGVuLXNlZ21lbnRMZW4pOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNhbWUgY2hhcmFjdGVyIHJlcGVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGVhdChjaGFyIGMsIGludCBjb3VudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihjb3VudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB1bmxlc3MgaXQgaXMgZW10cHR5IHdoZXJlIGl0IHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBudWxsSWZFbXB0eShTdHJpbmcgcykgewotCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPT0gMCkgewotCQkJcyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCS8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFzIHRoZSBhcmd1bWVudCBzdHJpbmcgCi0JICogZXhjZXB0IHRoYXQgdGhlIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkgdGhlIHRoZWlyIGhleCBjb2RlLgotCSAqIEZvciBleGFtcGxlIGlmIHRoZSBzdHJpbmcgaXMgImFiXG5jIiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzICJhYnsweEF9YyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmlzaWJsZVN0cmluZyhTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChjIDw9IDB4MUYgfHwgKGMgPT0gMHgyMCAmJiAoaSA9PSAwIHx8IGkgPT0gbGVuLTEpKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIigweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpYykudG9VcHBlckNhc2UoKSArICIpIik7Ci0JCQl9Ci0JCQllbHNlIGJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBSZXBsYWNlcyBhIHBvcnRpb24gb2Ygc3RyaW5nLgotCSAqIEBwYXJhbSBzdHIgVGhlIG9yaWdpbmFsIHN0cmluZy4KLQkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW4gdGhlIG9yaWdpbmFsIHN0cmluZyB3aGVyZSB0aGUgcmVwbGFjZSBzdGFydHMKLQkgKiBAcGFyYW0gbGVuIFRoZSByZXBsYWNlIGxlbmd0aCB0aGUgb3JpZ2luYWwgc3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VTdHIgVGhlIHJlcGxhY2VtZW50IHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0clJlcGxhY2UoU3RyaW5nIHN0ciwgaW50IG9mZnNldCwgaW50IGxlbiwgU3RyaW5nIHJlcGxhY2VTdHIpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLmxlbmd0aCgpLWxlbityZXBsYWNlU3RyLmxlbmd0aCgpKTsKLQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKDAsIG9mZnNldCkpOwotCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VTdHIpOwotCQlidWZmZXIuYXBwZW5kKHN0ci5zdWJzdHJpbmcob2Zmc2V0K2xlbikpOwotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJSZXBsYWNlKFN0cmluZyBzdHIsIFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZVN0cikKLQl7Ci0JCWlmKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZihwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHMoIiIpKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCWludCBpbmRleCA9IHN0ci5pbmRleE9mKHBhdHRlcm4pOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHN0cjsKLQkJCi0JCWlmIChyZXBsYWNlU3RyID09IG51bGwpCi0JCQlyZXBsYWNlU3RyID0gIiI7Ci0JCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHJlcGxhY2VTdHIgKyBzdHIuc3Vic3RyaW5nKGluZGV4ICsgcGF0dGVybi5sZW5ndGgoKSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0clJlcGxhY2VBbGwoU3RyaW5nIHN0ciwgU3RyaW5nIHBhdHRlcm4sIFN0cmluZyByZXBsYWNlU3RyKQotCXsKLQkJaWYoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChyZXBsYWNlU3RyID09IG51bGwpCi0JCQlyZXBsYWNlU3RyID0gIiI7Ci0JCWlmKHBhdHRlcm4gPT0gbnVsbCB8fCBwYXR0ZXJuLmVxdWFscygiIikpIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJaW50IGluZGV4ID0gc3RyLmluZGV4T2YocGF0dGVybik7Ci0JCXdoaWxlIChpbmRleCA+PSAwKSB7Ci0JCQlzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHJlcGxhY2VTdHIgKyBzdHIuc3Vic3RyaW5nKGluZGV4ICsgcGF0dGVybi5sZW5ndGgoKSk7Ci0JCQlpbmRleCA9IHN0ci5pbmRleE9mKHBhdHRlcm4sIGluZGV4K3JlcGxhY2VTdHIubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ckluc2VydChTdHJpbmcgc3RyLCBpbnQgaW5kZXgsIFN0cmluZyBpbnNlcnRTdHIpCi0JewotCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpbmRleCkKLQkJCQkrIGluc2VydFN0cgotCQkJCSsgc3RyLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotICAgIC8qKgotICAgICAqIFRva2VuaXplIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZgotICAgICAqIHdvcmRzLgotICAgICAqIElmIHRoZSBzdHJpbmcgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LCB0aGlzCi0gICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzICAgICAgVGhlIHN0cmluZyB0byB0b2tlbml6ZSBpbnRvIGEgPGNvZGU+TGlzdDwvY29kZT4uCi0gICAgICogQHBhcmFtIHNlcCAgICBUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciB0byB1c2UgdG8gc3BsaXQKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSBzdHJpbmcuCi0gICAgICogQHBhcmFtIHRyaW0gICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgcnVuIDxjb2RlPnRyaW08L2NvZGU+IG9uCi0gICAgICogICAgICAgICAgICAgICBlYWNoIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCA8Y29kZT5MaXN0PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+TGlzdDwvY29kZT4gY29udGFpbmluZyBhbGwgdG9rZW5pemVkIHdvcmRzCi0gICAgICogICAgICAgICBpbiB0aGUgcGFyYW1ldGVyIHN0cmluZy4KLSAgICAgKiAgICAgICAgIEVhY2ggZWxlbWVudCBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gc3RyVG9MaXN0KFN0cmluZyBzLCBjaGFyIHNlcCwgYm9vbGVhbiB0cmltKQotCXsKLQkvL2V4OiBpZiBzZXAgaXMgJzsnIHRoZW4gcyBzaG91bGQgYmUgc29tZXRpbmcgbGlrZSAiUmVkO0JsYWNrIgotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJY2hhciBkZWxpbWl0ZXJzW10gPSB7c2VwfTsKLQkJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihzLCBuZXcgU3RyaW5nKGRlbGltaXRlcnMpLCB0cnVlLypyZXR1cm5EZWxpbWl0ZXJzKi8pOwotCQlTdHJpbmcgbGFzdFRvaz1udWxsOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRvayA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2subGVuZ3RoKCk9PTEgJiYgdG9rLmNoYXJBdCgwKT09c2VwKXsvL2RlbGltaXRlcgotCQkJICAgIGlmICh0b2suZXF1YWxzKGxhc3RUb2spfHxsYXN0VG9rPT1udWxsLypmaXJzdCBlbGVtZW50IGlzIGVtcHR5Ki8pCi0JCQkgICAgICAgIHJlc3VsdC5hZGQoIiIpOwotCQkJfQotCQkJZWxzZXsKLQkJCSAgICBpZiAodHJpbSkKLQkJCSAgICAgICAgdG9rID0gdG9rLnRyaW0oKTsKLQkJCSAgICByZXN1bHQuYWRkKHRvayk7Ci0JCQl9Ci0JCQlsYXN0VG9rPXRvazsKLQkJfQotCQlpZihsYXN0VG9rLmxlbmd0aCgpPT0xICYmIGxhc3RUb2suY2hhckF0KDApPT1zZXApLy9sYXN0IGVsZW1lbnQgaXMgZW1wdHkKLQkJICAgIHJlc3VsdC5hZGQoIiIpOwotCQlyZXN1bHQudHJpbVRvU2l6ZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBzdHJUb0xpc3QoU3RyaW5nIHMsIGNoYXIgc2VwKQotCXsKLQkJcmV0dXJuIHN0clRvTGlzdChzLCBzZXAsIGZhbHNlLyp0cmltKi8pOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0VG9TdHIoQ29sbGVjdGlvbiBhLCBjaGFyIHNlcCkKLQl7Ci0JCXJldHVybiBsaXN0VG9TdHIoYSwgU3RyaW5nLnZhbHVlT2Yoc2VwKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpc3RUb1N0cihDb2xsZWN0aW9uPE9iamVjdD4gYSwgU3RyaW5nIHNlcCkgewotCQkvL3JldmVyc2Ugb2Ygc3RyVG9MaXN0Ci0JCWlmIChhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGNvdW50ID0gYS5zaXplKCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBhLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKHNlcCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCWJ1ZmZlci5hcHBlbmQoKFN0cmluZylvYmopOwotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQob2JqKTsKLQkJfQotCQlyZXR1cm4gKGJ1ZmZlciAhPSBudWxsKSA/IGJ1ZmZlci50b1N0cmluZygpIDogbnVsbDsKLQl9Ci0JLyoqCi0JICogQ29udmVydCB0aGUgdGV4dCBvZiBhIFN0cmluZyBpbnRvIGEgTWFwIG9mIFN0cmluZ3MsIHdoZXJlIGVhY2gKLQkgKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBNYXAgaXMgb2YgdHlwZSBTdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHMgICAgICBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKiBAcGFyYW0gc2VwMSAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXlzIGFuZCB0aGVpcgotCSAqICAgICAgICAgICAgICAgdmFsdWVzLgotCSAqIEBwYXJhbSBzZXAyICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleS12YWx1ZSBwYWlycy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgY29udmVydGVkIHRvIGEgTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcDxTdHJpbmcsIFN0cmluZz4gc3RyVG9NYXAoU3RyaW5nIHMsIGNoYXIgc2VwMSwgY2hhciBzZXAyKQotCXsKLQkJcmV0dXJuIHN0clRvTWFwKHMsIHNlcDEsIHNlcDIsIGZhbHNlLypsb3dlcmNhc2VLZXlzKi8pOwotCX0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSB0ZXh0IG9mIGEgU3RyaW5nIGludG8gYSBNYXAgb2YgU3RyaW5ncywgd2hlcmUgZWFjaAotCSAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIE1hcCBpcyBvZiB0eXBlIFN0cmluZy4KLQkgKiBUaGlzIGZvcm0gYWxzbyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhhdCBhbGwga2V5cyB3aWxsIGJlCi0JICogY29udmVydGVkIHRvIGxvd2VyLWNhc2UgYmVmb3JlIGFkZGluZyB0byB0aGUgTWFwLgotCSAqIAotCSAqIEBwYXJhbSBzICAgICAgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBNYXAuCi0JICogQHBhcmFtIHNlcDEgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5cyBhbmQgdGhlaXIKLQkgKiAgICAgICAgICAgICAgIHZhbHVlcy4KLQkgKiBAcGFyYW0gc2VwMiAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXktdmFsdWUgcGFpcnMuCi0JICogQHBhcmFtIGxvd2VyY2FzZUtleXMKLQkgKiAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gY29udmVydCBrZXlzIHRvIGxvd2VyIGNhc2UKLQkgKiAgICAgICAgICAgICAgIGJlZm9yZSBhZGRpbmcgdG8gdGhlIE1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgY29udmVydGVkIHRvIGEgTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcDxTdHJpbmcsIFN0cmluZz4gc3RyVG9NYXAoU3RyaW5nIHMsIGNoYXIgc2VwMSwgY2hhciBzZXAyLCBib29sZWFuIGxvd2VyY2FzZUtleXMpCi0JewotCQkvL2V4OiBpZiBzZXAxIGlzICc6JyBhbmQgc2VwMiBpcyAnLCcgdGhlbiBzIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSAiY29sb3I6UmVkLHNpemU6WEwiCi0JCQotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0JCX0KLQkJCQotCQlqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IGEgPSBzdHJUb0xpc3Qocywgc2VwMik7Ci0JCWlmIChhID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotCQl9Ci0JCQotCQlqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWludCBjb3VudCA9IGEuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCXsKLQkJCVN0cmluZyBzMiA9IChTdHJpbmcpYS5nZXQoaSk7IC8vZXg6IGNvbG9yOlJlZAotCQkJaW50IHBvcyA9IHMyLmluZGV4T2Yoc2VwMSk7Ci0JCQlpZiAocG9zID49IDApCi0JCQl7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzMi5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCQlTdHJpbmcgdmFsID0gczIuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQlpZiAobG93ZXJjYXNlS2V5cykKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQlobS5wdXQobmFtZSwgdmFsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaG07Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcFRvU3RyKGphdmEudXRpbC5NYXAgaG0sIGNoYXIgc2VwMSwgY2hhciBzZXAyKQotCS8vcmV2ZXJzZSBvZiBzdHJUb01hcAotCXsKLQkJaWYgKGhtID09IG51bGwgfHwgaG0uaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlqYXZhLnV0aWwuSXRlcmF0b3I8amF2YS51dGlsLk1hcC5FbnRyeT4gaXRlciA9IGhtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhLnV0aWwuTWFwLkVudHJ5IGVudHJ5ID0gKGphdmEudXRpbC5NYXAuRW50cnkpaXRlci5uZXh0KCk7Ci0JCQlidWZmZXIuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoc2VwMSk7Ci0JCQlidWZmZXIuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChzZXAyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSA8ZW0+Y2FzZSBpbnNlbnNpdGl2ZTwvZW0+IGNvbXBhcmlzb24gYmV0d2VlbgotICAgICAqIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHR3byBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmoxICAgVGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlLgotICAgICAqIEBwYXJhbSBvYmoyICAgVGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJvdGggb2JqZWN0cyBoYXZlIHRoZQotICAgICAqICAgICAgICAgc2FtZSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUFzU3RyaW5ncyhPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpCi0JewkKLQkJaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwpCi0JCQlyZXR1cm4gb2JqMSA9PSBvYmoyOwotCQkKLQkJU3RyaW5nIHMxLCBzMjsKLQkJaWYgKG9iajEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXMxID0gKFN0cmluZylvYmoxOwotICAgICAgICB9IGVsc2UgewotCQkJczEgPSBvYmoxLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQkJaWYgKG9iajIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXMyID0gKFN0cmluZylvYmoyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCQkJczIgPSBvYmoyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQkJCi0JCXJldHVybiBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhIHN0cmluZyBzdGFydHMgd2l0aCBhbnkgb2YgYSBsaXN0IG9mIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGhBbnkoU3RyaW5nIHMsIExpc3Q8U3RyaW5nPiBwcmVmaXhlcykgewotCQlpbnQgY291bnQgPSBwcmVmaXhlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJaWYgKHMuc3RhcnRzV2l0aCgoU3RyaW5nKXByZWZpeGVzLmdldChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFyZ3VtZW50IHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyIHVwcGVyLWNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdFVwcGVyKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyLmNoYXJBdCgwKSkgKyBzdHIuc3Vic3RyaW5nKDEpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgY2hhciBsb3dlci1jYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRMb3dlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0ci5jaGFyQXQoMCkpICsgc3RyLnN1YnN0cmluZygxKTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIGFyZSB1cHBlcgotCSAqIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBwZXJDYXNlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBzLnRvVXBwZXJDYXNlKCkuZXF1YWxzKHMpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBub24td2hpdGUgY2hhciBpbmRleCBzdGFydGluZyBmcm9tIHRoZSAKLQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2tpcFdoaXRlU3BhY2VzKFN0cmluZyBzdHIsIGludCBpbmRleCkgewotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQl3aGlsZSAoaW5kZXggPCBsZW4pIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KGluZGV4KSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCSsraW5kZXg7Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQkvKioKLQkgKiBDb2xsYXBzZXMgY29uc2VjdXRpdmUgd2hpdGUgc3BhY2VzIGludG8gb25lIHNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlV2hpdGVTcGFjZXMoU3RyaW5nIHN0cil7Ci0JICAgIFN0cmluZyByZXN1bHQ9bnVsbDsKLQkgICAgaWYgKHN0ciE9bnVsbCl7Ci0JICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyPW5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgICAgIGJvb2xlYW4gaXNJbldoaXRlU3BhY2U9ZmFsc2U7Ci0JICAgICAgICBmb3IgKGludCBpPTA7aTxzdHIubGVuZ3RoKCk7aSsrKXsKLQkgICAgICAgICAgICBjaGFyIGM9c3RyLmNoYXJBdChpKTsKLQkgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSl7Ci0JICAgICAgICAgICAgICAgIGlzSW5XaGl0ZVNwYWNlPXRydWU7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgICAgICBpZiAoaXNJbldoaXRlU3BhY2UpCi0JICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgIik7Ci0JICAgICAgICAgICAgICAgIGlzSW5XaGl0ZVNwYWNlPWZhbHNlOyAgIAotCSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHJlc3VsdD1idWZmZXIudG9TdHJpbmcoKTsKLQkgICAgfQotCSAgICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZHMgdXNlZCB0byBjb252ZXJ0IERCIG9iamVjdCBuYW1lcyB0byAgCi0JICogYXBwcm9wcmlhdGUgSmF2YSB0eXBlIGFuZCBmaWVsZCBuYW1lIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBsdXJhbGlzZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbmFtZTsKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSkgewotCQkJcmVzdWx0ICs9ICdzJzsKLQkJfSBlbHNlIGlmICghc2VlbXNQbHVyYWxpc2VkKG5hbWUpKSB7Ci0JCQlTdHJpbmcgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAoIWxvd2VyLmVuZHNXaXRoKCJkYXRhIikpIHsgLy9vcmRlckRhdGEgLS0+IG9yZGVyRGF0YXMgaXMgZHVtYgotCQkJCWNoYXIgc2Vjb25kTGFzdCA9IGxvd2VyLmNoYXJBdChuYW1lLmxlbmd0aCgpIC0gMik7Ci0JCQkJaWYgKCFpc1Zvd2VsKHNlY29uZExhc3QpICYmIGxvd2VyLmVuZHNXaXRoKCJ5IikpIHsKLQkJCQkJLy8gY2l0eSwgYm9keSBldGMgLS0+IGNpdGllcywgYm9kaWVzCi0JCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKSArICJpZXMiOwotCQkJCX0gZWxzZSBpZiAobG93ZXIuZW5kc1dpdGgoImNoIikgfHwgbG93ZXIuZW5kc1dpdGgoInMiKSkgewotCQkJCQkvLyBzd2l0Y2ggLS0+IHN3aXRjaGVzICBvciBidXMgLS0+IGJ1c2VzCi0JCQkJCXJlc3VsdCA9IG5hbWUgKyAiZXMiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5hbWUgKyAicyI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2luZ3VsYXJpc2UoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5hbWU7Ci0JCWlmIChzZWVtc1BsdXJhbGlzZWQobmFtZSkpIHsKLQkJCVN0cmluZyBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCWlmIChsb3dlci5lbmRzV2l0aCgiaWVzIikpIHsKLQkJCQkvLyBjaXRpZXMgLS0+IGNpdHkKLQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMykgKyAieSI7Ci0JCQl9IGVsc2UgaWYgKGxvd2VyLmVuZHNXaXRoKCJjaGVzIikgfHwgbG93ZXIuZW5kc1dpdGgoInNlcyIpKSB7Ci0JCQkJLy8gc3dpdGNoZXMgLS0+IHN3aXRjaCBvciBidXNlcyAtLT4gYnVzCi0JCQkJcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpOwotCQkJfSBlbHNlIGlmIChsb3dlci5lbmRzV2l0aCgicyIpKSB7Ci0JCQkJLy8gY3VzdG9tZXJzIC0tPiBjdXN0b21lcgotCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzVm93ZWwoY2hhciBjKSB7Ci0JCWJvb2xlYW4gdm93ZWwgPSBmYWxzZTsKLQkJdm93ZWwgfD0gYyA9PSAnYSc7Ci0JCXZvd2VsIHw9IGMgPT0gJ2UnOwotCQl2b3dlbCB8PSBjID09ICdpJzsKLQkJdm93ZWwgfD0gYyA9PSAnbyc7Ci0JCXZvd2VsIHw9IGMgPT0gJ3UnOwotCQl2b3dlbCB8PSBjID09ICd5JzsKLQkJcmV0dXJuIHZvd2VsOwotCX0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlZW1zUGx1cmFsaXNlZChTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIHBsdXJhbGlzZWQgPSBmYWxzZTsKLQkJcGx1cmFsaXNlZCB8PSBuYW1lLmVuZHNXaXRoKCJlcyIpOwotCQlwbHVyYWxpc2VkIHw9IG5hbWUuZW5kc1dpdGgoInMiKTsKLQkJcGx1cmFsaXNlZCAmPSAhKG5hbWUuZW5kc1dpdGgoInNzIikgfHwgbmFtZS5lbmRzV2l0aCgidXMiKSk7Ci0JCXJldHVybiBwbHVyYWxpc2VkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgb2YgYSBjbGFzcyBuYW1lLgotCSAqIEZvciBleGFtcGxlIGlmIGdpdmVuIDxjb2RlPm9yYWNsZS51dGlsLk9iamVjdFV0aWw8L2NvZGU+IGl0IHdvdWxkIHJldHVybiAKLQkgKiA8Y29kZT5vcmFjbGUudXRpbDwvY29kZT4uIElmIHRoZSBjbGFzcyBpcyBub3QgaW4gYSBwYWNrYWdlIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGFzdERvdEluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0RG90SW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZ2l2ZW4gYSBmdWxsIGNsYXNzIG5hbWUuCi0JICogRm9yIGV4YW1wbGUgaWYgZ2l2ZW4gPGNvZGU+b3JhY2xlLnV0aWwuT2JqZWN0VXRpbDwvY29kZT4gaXQgd291bGQgcmV0dXJuIAotCSAqIDxjb2RlPk9iamVjdFV0aWw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBmdWxsQ2xhc3NOYW1lKSB7Ci0JCWlmKGZ1bGxDbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxhc3REb3RJbmRleCA9IGZ1bGxDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3REb3RJbmRleCA8IDApCi0JCQlyZXR1cm4gZnVsbENsYXNzTmFtZTsKLQkJcmV0dXJuIGZ1bGxDbGFzc05hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCsxKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDb252ZXJ0cyBhIGRhdGFiYXNlIGNvbHVtbiBuYW1lIHRvIGEgSmF2YSB2YXJpYWJsZSBuYW1lICg8ZW0+Zmlyc3QgbGV0dGVyCi0JICogbm90IGNhcGl0YWxpemVkPC9lbT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbk5hbWVUb1Zhck5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJcmV0dXJuIGRiTmFtZVRvVmFyTmFtZShjb2x1bW5OYW1lKTsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSBkYXRhYmFzZSB0YWJsZSBuYW1lIHRvIGEgSmF2YSB2YXJpYWJsZSBuYW1lICg8ZW0+Zmlyc3QgbGV0dGVyCi0JICogbm90IGNhcGl0YWxpemVkPC9lbT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlTmFtZVRvVmFyTmFtZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBkYk5hbWVUb1Zhck5hbWUodGFibGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSBkYXRhYmFzZSBuYW1lICh0YWJsZSBvciBjb2x1bW4pIHRvIGEgamF2YSBuYW1lICg8ZW0+Zmlyc3QgbGV0dGVyCi0JICogbm90IGNhcGl0YWxpemVkPC9lbT4pLiBlbXBsb3llZV9uYW1lIG9yIGVtcGxveWVlLW5hbWUgLT4gZW1wbG95ZWVOYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRiTmFtZVRvVmFyTmFtZShTdHJpbmcgcykgewotCQlpZiAoIiIuZXF1YWxzKHMpKSB7Ci0JCQlyZXR1cm4gczsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJvb2xlYW4gY2FwaXRhbGl6ZSA9IHRydWU7Ci0JCWJvb2xlYW4gbGFzdENhcGl0YWwgPSBmYWxzZTsKLQkJYm9vbGVhbiBsYXN0RGVjYXBpdGFsaXplZCA9IGZhbHNlOwotCQlTdHJpbmcgcCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgYyA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKTsKLQkJCWlmICgiXyIuZXF1YWxzKGMpIHx8ICIgIi5lcXVhbHMoYykpIHsKLQkJCQljYXBpdGFsaXplID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGMudG9VcHBlckNhc2UoKS5lcXVhbHMoYykpIHsKLQkJCQlpZiAobGFzdERlY2FwaXRhbGl6ZWQgJiYgIWxhc3RDYXBpdGFsKSB7Ci0JCQkJCWNhcGl0YWxpemUgPSB0cnVlOwotCQkJCX0KLQkJCQlsYXN0Q2FwaXRhbCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWxhc3RDYXBpdGFsID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChjYXBpdGFsaXplKSB7Ci0JCQkJaWYgKHAgPT0gbnVsbCB8fCAhcC5lcXVhbHMoIl8iKSkgewotCQkJCQlyZXN1bHQuYXBwZW5kKGMudG9VcHBlckNhc2UoKSk7Ci0JCQkJCWNhcGl0YWxpemUgPSBmYWxzZTsKLQkJCQkJcCA9IGM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFwcGVuZChjLnRvTG93ZXJDYXNlKCkpOwotCQkJCQljYXBpdGFsaXplID0gZmFsc2U7Ci0JCQkJCXAgPSBjOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjLnRvTG93ZXJDYXNlKCkpOwotCQkJCWxhc3REZWNhcGl0YWxpemVkID0gdHJ1ZTsKLQkJCQlwID0gYzsKLQkJCX0KLQotCQl9Ci0JCS8qdGhpcyB3YXMgdXNpbmcgU3RyaW5nVXRpbC5pbml0TG93ZXIuIENoYW5nZWQgdG8gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZSBzbyB0aGF0IAotCQkgKiBpdCByZXR1cm5zIHRoZSBjb3JyZWN0IGJlYW4gcHJvcGVydHkgbmFtZSB3aGVuIGNhbGxlZCBmcm9tIGNvbHVtbk5hbWVUb1Zhck5hbWUuCi0JCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3RoZXJ3aXNlIFVSTCB3b3VsZCBiZSB1Ukwgd2hpY2ggd291bGQgY2F1c2UgCi0JCSAqIGFuICJUaGUgcHJvcGVydHkgdVJMIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgeHgiIGVycm9yIGJlY2F1c2UgCi0JCSAqIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyAodXNlZCBieSBKYXZhVHlwZUludHJvc3BlY3RvcikgcmV0dXJucyAKLQkJICogdGhlIHByb3BlcnR5IG5hbWUgYXMgVVJMLiovCi0JCVN0cmluZyByZXN1bHRTdHIgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHJlc3VsdC50b1N0cmluZygpKTsKLQkJaWYgKHJlc3VsdFN0ci5lcXVhbHMoImNsYXNzIikpIHsKLQkJCS8vICJjbGFzcyIgaXMgaWxsZWdhbCBiZWNhdXNlT2YgT2JqZWN0LmdldENsYXNzKCkgY2xhc2gKLQkJCXJlc3VsdFN0ciA9ICJjbGF6eiI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFN0cjsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcGFyZSB0d28gb2JqZWN0cy4gSWYgYm90aCBTdHJpbmcsIGlnbm9yZSBjYXNlCi0JICogQHBhcmFtIG8xCi0JICogQHBhcmFtIG8yCi0JICogQHBhcmFtIGlnbm9yZUNhc2VJZlN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxPYmplY3RzKE9iamVjdCBvMSwgT2JqZWN0IG8yLCBib29sZWFuIGlnbm9yZUNhc2VJZlN0cikKLQl7Ci0JCWlmIChvMSA9PSBvMikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgYm9vbGVhbiByZXN1bHQ7Ci0JICAgIGlmIChvMSA9PSBudWxsIHx8IG8yID09IG51bGwpIHsKLQkgICAgCXJldHVybiBmYWxzZTsgLy93ZSBhbHJlYWR5IGNoZWNrZWQgbzEgPT0gbzIgYWJvdmUKLQkgICAgfQotCSAgICBpZiAoaWdub3JlQ2FzZUlmU3RyICYmIG8xIGluc3RhbmNlb2YgU3RyaW5nICYmIG8yIGluc3RhbmNlb2YgU3RyaW5nKQotCSAgICAgICAgcmVzdWx0ID0gKChTdHJpbmcpbzEpLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZylvMik7Ci0JICAgIGVsc2UKLQkgICAgICAgIHJlc3VsdCA9IG8xLmVxdWFscyhvMik7Ci0JCi0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsT2JqZWN0cyhPYmplY3QgbzEsIE9iamVjdCBvMikKLQl7Ci0JICAgIHJldHVybiBlcXVhbE9iamVjdHMobzEsIG8yLCBmYWxzZS8qaWdub3JlQ2FzZUlmU3RyKi8pOwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL1VybFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvdXRpbC9VcmxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZWY4ZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC91dGlsL1VybFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDb2xsZWN0aW9ucyBvZiB1dGlsaXR5IG1ldGhvZHMgaGFuZGxpbmcgVVJMcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVXJsVXRpbAotewotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBmaWxlIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZSI7Ci0JLyoqCi0JICogVGhlIDxjb2RlPmZpbGU8L2NvZGU+IHN0cmluZyBpbmRpY2F0aW5nIGEgdXJsIGh0dHAgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwIjsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgaHR0cCBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQU19QUk9UT0NPTCA9ICJodHRwcyI7Ci0JLyoqCi0JICogVGhlIDxjb2RlPmZpbGU8L2NvZGU+IHN0cmluZyBpbmRpY2F0aW5nIGEgdXJsIGZpbGUgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1BST1RPQ09MID0gImphciI7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB1cmwgaXMgdG8gYSBmaWxlLCBpLmUgaXRzIHByb3RvY29sIGlzIDxjb2RlPmZpbGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVVcmwoVVJMIHVybCkgewotCQlyZXR1cm4gdXJsICE9IG51bGwgJiYgRklMRV9QUk9UT0NPTC5lcXVhbHModXJsLmdldFByb3RvY29sKCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB1cmwgaXMgdG8gYSBqYXIsIGkuZSBpdHMgcHJvdG9jb2wgaXMgPGNvZGU+amFyPC9jb2RlPi4KLQkgKiBGb3IgZXhhbXBsZSA8Y29kZT5qYXI6ZmlsZTovQzovdGVzdGFwcHMvZXhhbXBsZS9XRUItSU5GL2xpYi9zdHJ1dHMuamFyIS9NRVRBLUlORi90bGRzL3N0cnV0cy1iZWFuLnRsZDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmFyVXJsKFVSTCB1cmwpIHsKLQkJcmV0dXJuIHVybCAhPSBudWxsICYmIEpBUl9QUk9UT0NPTC5lcXVhbHModXJsLmdldFByb3RvY29sKCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB1cmwgcHJvdG9jb2wgaXMgaHR0cC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIdHRwVXJsKFVSTCB1cmwpIHsKLQkJU3RyaW5nIHByb3RvY29sID0gIHVybC5nZXRQcm90b2NvbCgpOwotCQlyZXR1cm4gdXJsICE9IG51bGwgJiYgKEhUVFBfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSB8fCBIVFRQU19QUk9UT0NPTC5lcXVhbHMocHJvdG9jb2wpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+RmlsZTwvY29kZT4gY29ycmVzcG9uZGluZyB0byBhIHVybCwgb3IgbnVsbCBpZiB0aGUgdXJsIAotCSAqIHByb3RvY29sIGlzIG5vdCBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5pby5GaWxlIGdldFVybEZpbGUoVVJMIHVybCkgewotCQlpZiAoaXNGaWxlVXJsKHVybCkgJiYgIWlzSmFyVXJsKCB1cmwgKSApewotCQkJRmlsZSByZXQgPSBuZXcgamF2YS5pby5GaWxlKHVybC5nZXRGaWxlKCkpOwotCQkJcmV0dXJuIHJldCA7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gCX0KLQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybCB0byBhIGphciBmaWxlIGdpdmVuIGEgdXJsIHRvIGEgZmlsZSBpbnNpZGUgCi0JICogdGhlIGphci4KLQkgKiBGb3IgZXhhbXBsZSBpZiBnaXZlbiAKLQkgKiA8Y29kZT5qYXI6ZmlsZTovQzovdGVzdGFwcHMvZXhhbXBsZS9XRUItSU5GL2xpYi9zdHJ1dHMuamFyIS9NRVRBLUlORi90bGRzL3N0cnV0cy1iZWFuLnRsZDwvY29kZT4KLQkgKiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphcjwvY29kZT4uCi0JICogCi0JICogPHA+UmV0dXJucyBudWxsIGlmIHRoZSBnaXZlbiB1cmwgaXMgbm90IHJlY29nbml6ZWQgYXMgYSB1cmwgdG8gYSBmaWxlIAotCSAqIGluc2lkZSBhIGphci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRKYXJGaWxlVXJsKFVSTCB1cmwpIHsKLQkJaWYgKCFpc0phclVybCh1cmwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgZmlsZSA9IHVybC5nZXRGaWxlKCk7IC8vZmlsZTovQzovdGVzdGFwcHMvZXhhbXBsZS9XRUItSU5GL2xpYi9zdHJ1dHMuamFyIS9NRVRBLUlORi90bGRzL3N0cnV0cy1iZWFuLnRsZAotCQlpbnQgaW5kZXggPSBmaWxlLmluZGV4T2YoJyEnKTsKLQkJaWYgKGluZGV4IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGphckZpbGVVcmxTdHIgPSBmaWxlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChqYXJGaWxlVXJsU3RyKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlbW90ZShTdHJpbmcgdXJsKXsKLQkJcmV0dXJuIHVybC5zdGFydHNXaXRoKCJodHRwOiIpfHx1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Iil8fHVybC5zdGFydHNXaXRoKCJ3d3cuIik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZW1wbGF0ZUZvbGRlcihTdHJpbmcgcGx1Z0lkICwgU3RyaW5nIHN0clBhdGggKXsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSggcGx1Z0lkICk7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCBzdHJQYXRoICk7Ci0JCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCXRyeSB7Ci0JCQlVUkwgdGVtcGxVcmw7Ci0JCQl0ZW1wbFVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCUZpbGUgdGVtcGxEaXIgPSBVcmxVdGlsLmdldFVybEZpbGUodGVtcGxVcmwpOwotCQkJcmV0dXJuIHRlbXBsRGlyIDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9jb2x1bW4udm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9jb2x1bW4udm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWYxM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvY29sdW1uLnZtCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBAQ29sdW1uIGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAiY29sdW1uIiBhbmQgYSAidGFibGUiIG9iamVjdAotIyNnZW5lcmF0ZSBhbm5vdGF0aW9uIG9ubHkgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb2x1bW4gTk9UIGRlZmF1bHQKLSMjYW5kIHRoZSBnZW5lcmF0ZURMTEFubm90YXRpb24gcHJvcGVydHkgaXMgbm90IHNldCBvbiB0aGUgdGFibGUKLSMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI21hY3JvKCBhcHBlbmQgJG1lbWJlcnMgJHBhcmFtZXRlcnMgKQotI2lmKCAkbWVtYmVycyA9PSAiIikKLSNzZXQoICRtZW1iZXJzID0gJHBhcmFtZXRlcnMgKQotI2Vsc2UKLSNzZXQoICRtZW1iZXJzID0gIiRtZW1iZXJzLCAkcGFyYW1ldGVycyIgKSAKLSNlbmQJCi0jZW5kCi0jIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAoICRjb2x1bW4uZGF0YVR5cGVMT0IpCi0gICAgQExvYigpCi0jZW5kCi0jaWYgKCAkY29sdW1uLm5lZWRNYXBUZW1wb3JhbFR5cGUpCi0gICAgQFRlbXBvcmFsKCBUZW1wb3JhbFR5cGUuJGNvbHVtbi50ZW1wb3JhbFR5cGUpCi0jZW5kCi0jc2V0ICgkbWVtYmVycyA9ICIiKQotI2lmICggISRjb2x1bW4uZGVmYXVsdCB8fCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkKLSNpZiAoICEke2NvbHVtbi5kZWZhdWx0bmFtZX0gKQotI2FwcGVuZCgkbWVtYmVycyAibmFtZT0kY3VzdG9taXplci5xdW90ZSgkY29sdW1uLm5hbWUpIiApCi0jZW5kCi0jaWYgKCEkY29sdW1uLmluc2VydGFibGUpCi0jYXBwZW5kKCR7bWVtYmVyc30gImluc2VydGFibGU9ZmFsc2UiKQotI2VuZAotI2lmICghJGNvbHVtbi51cGRhdGVhYmxlKQotI2FwcGVuZCgke21lbWJlcnN9ICJ1cGRhdGFibGU9ZmFsc2UiKQotI2VuZAotI2VuZAotI2lmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkKLSNpZiAoJGNvbHVtbi51bmlxdWUpCi0jYXBwZW5kKCRtZW1iZXJzICAidW5pcXVlPXRydWUiKQotI2VuZAotI2lmICghJGNvbHVtbi5udWxsYWJsZSkKLSNhcHBlbmQoJG1lbWJlcnMgICJudWxsYWJsZT1mYWxzZSIpCi0jZW5kCi0jaWYgKCRjb2x1bW4uc2l6ZSA+IDApCi0jaWYgKCRjb2x1bW4ubnVtZXJpYykKLSNhcHBlbmQoJG1lbWJlcnMgInByZWNpc2lvbj0kY29sdW1uLnNpemUiKQotI2lmICgkY29sdW1uLmRlY2ltYWxEaWdpdHMgIT0gMCAmJiAkY29sdW1uLmRlY2ltYWxEaWdpdHMgIT0gLTEpCi0jYXBwZW5kKCRtZW1iZXJzICJzY2FsZT0kY29sdW1uLmRlY2ltYWxEaWdpdHMiKQotI2VuZAotI2Vsc2UKLSNpZiAoICEkY29sdW1uLmRhdGFUeXBlTE9CKQotI2FwcGVuZCgkbWVtYmVycyAibGVuZ3RoPSRjb2x1bW4uc2l6ZSIpCi0jZW5kCi0jZW5kCi0jZW5kCi0jZW5kCi0jaWYoICRtZW1iZXJzICE9IiIgKQotCUBDb2x1bW4oJG1lbWJlcnMpCi0jZW5kCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9qb2luLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvam9pbi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxODkyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9qb2luLnZtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBASm9pblRhYmxlLCBASm9pbkNvbHVtbiBvciBASm9pbkNvbHVtbnMgYW5ub3RhdGlvbi4KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlCi0jIwotIyNtYWNybyBqb2luQ29sdW1uIHVzZXMgJGNvbHVtbiwgJHJlZmVyZW5jZWRDb2x1bW4KLSNtYWNybyAoam9pbkNvbHVtbiAkY29sdW1uICRyZWZlcmVuY2VkQ29sdW1uKQotI3NldCAoJG1lbWJlcnMgPSAibmFtZT0kY3VzdG9taXplci5xdW90ZSgkY29sdW1uLmpvaW5Db2x1bW5OYW1lKSIpCi0jaWYoICEkcmVmZXJlbmNlZENvbHVtbi5wcmltYXJ5S2V5IHx8ICRyZWZlcmVuY2VkQ29sdW1uLnBhcnRPZkNvbXBvc2l0ZVByaW1hcnlLZXkgKQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSRjdXN0b21pemVyLnF1b3RlKCRyZWZlcmVuY2VkQ29sdW1uLm5hbWUpIikKLSNlbmQKLSNpZiggJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucyApCi0jaWYgKCRjb2x1bW4udW5pcXVlICYmICEkY29sdW1uLnByaW1hcnlLZXkpCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgdW5pcXVlPXRydWUiKQotI2VuZAotI2lmICghJGNvbHVtbi5udWxsYWJsZSkKLSNzZXQgKCRtZW1iZXJzID0gIiRtZW1iZXJzLCBudWxsYWJsZT1mYWxzZSIpCi0jZW5kCi0jZW5kCi0jaWYgKCRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgJiYgISRyb2xlLmFzc29jaWF0aW9uLmpvaW5UYWJsZSAmJiAhJHJvbGUucmVmZXJyZXJUYWJsZS5pc0NvbHVtblVwZGF0ZUluc2VydCgkcm9sZSwgJGNvbHVtbikpCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlIikKLSNlbmQKLUBKb2luQ29sdW1uKCRtZW1iZXJzKSNlbmQKLSMjCi0jIwotIyMKLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uam9pblRhYmxlKQotI3NldCAoJGpvaW5UYWJsZSA9ICRyb2xlLmFzc29jaWF0aW9uLmpvaW5UYWJsZSkKLQlASm9pblRhYmxlKAotCQluYW1lPSIke2pvaW5UYWJsZS5qb2luVGFibGVBbm5vdGF0aW9uTmFtZX0iCi0JCSwgam9pbkNvbHVtbnM9ewotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHJvbGUucmVmZXJyZXJDb2x1bW5zKQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcmVuY2VkQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkKLSMjJHJlZmVyZW5jZWRDb2x1bW4gaXMgdGhlIGNvbHVtbiBpbiB0aGUgam9pbiB0YWJsZQotCQkJI2pvaW5Db2x1bW4oJHJlZmVyZW5jZWRDb2x1bW4gJGNvbHVtbikKLSNpZiAoJHZlbG9jaXR5Q291bnQgPCAkcm9sZS5yZWZlcnJlckNvbHVtbnMuc2l6ZSgpICkKLSwKLSNlbmQJCQkKLSNlbmQKLQotCQkJfQotCQksIGludmVyc2VKb2luQ29sdW1ucz17Ci0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkcm9sZS5yZWZlcmVuY2VkQ29sdW1ucykKLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW4oJHtjb2x1bW4ubmFtZX0pKQotIyMkcmVmZXJlbmNlZENvbHVtbiBpcyB0aGUgY29sdW1uIGluIHRoZSBqb2luIHRhYmxlCi0JCQkjam9pbkNvbHVtbigkcmVmZXJlbmNlZENvbHVtbiAkY29sdW1uKQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVyZW5jZWRDb2x1bW5zLnNpemUoKSApCi0sCi0jZW5kCQkJCi0jZW5kCi0KLQkJCX0KLQkJKQotI2Vsc2UKLSNpZiAoJHJvbGUucmVmZXJyZXJDb2x1bW5zLnNpemUoKSA9PSAxKQotI3NldCAoJGNvbHVtbiA9ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5nZXQoMCkpCi0jc2V0ICgkcmVmZXJlbmNlZENvbHVtbiA9ICRyb2xlLmdldFJlZmVyZW5jZWRDb2x1bW4oJHtjb2x1bW4ubmFtZX0pKQotI3NldCAoJHJlZmVyZW5jZWRUYWJsZU5hbWUgPSAkcm9sZS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCkgKQotI3NldCggJHJlZmVyZW5jZWRUYWJsZVBrTmFtZSA9ICRyb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKS5uYW1lICkKLSNzZXQoICRjb21wdXRlZEpvaW5Db2x1bW5OYW1lID0gIiR7cm9sZS5wcm9wZXJ0eU5hbWV9XyR7cmVmZXJlbmNlZFRhYmxlUGtOYW1lfSIgKQotI2lmKCRjb2x1bW4ubmFtZS50b1VwcGVyQ2FzZSgpICE9ICRjb21wdXRlZEpvaW5Db2x1bW5OYW1lLnRvVXBwZXJDYXNlKCkgKQotCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pCi0KLSNlbHNlaWYoICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQotCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pCi0KLSNlbmQKLSNlbHNlCi0JQEpvaW5Db2x1bW5zKHsKLSNmb3JlYWNoICgkY29sdW1uIGluICRyb2xlLnJlZmVycmVyQ29sdW1ucykKLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJlbmNlZENvbHVtbigke2NvbHVtbi5uYW1lfSkpCi0JCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pLAotI2VuZAkJCi0JCX0pCi0jZW5kCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwYTc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21haW4uamF2YS52bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0jaWYgKCR0YWJsZS5wYWNrYWdlICE9ICIiKQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9OwotI2VuZAotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKLSR7dGFibGUuaW1wb3J0U3RhdGVtZW50c30KLQotLyoqCi0gKiBUaGUgcGVyc2lzdGVudCBjbGFzcyBmb3IgdGhlICR7dGFibGUubmFtZX0gZGF0YWJhc2UgdGFibGUuCi0gKiAKLSAqLwotQEVudGl0eQotI2lmKCAhJHt0YWJsZS5kZWZhdWx0bmFtZX0gfHwgJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucykKLUBUYWJsZShuYW1lPSIke3RhYmxlLm5hbWV9IikKLSNlbmQKLXB1YmxpYyBjbGFzcyAke3RhYmxlLmNsYXNzTmFtZX0gJHt0YWJsZS5nZW5lcmF0ZUV4dGVuZHNJbXBsZW1lbnRzKCl9IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSMjIyMjCi0jIyMjIyBmaWVsZHMKLSMjIyMjCi0jaWYgKCR0YWJsZS5jb21wb3NpdGVLZXkpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikKLQotCUBFbWJlZGRlZElkCi0jZW5kCi0JcHJpdmF0ZSAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0gJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9OwotI2VuZAotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHRhYmxlLmdldFNpbXBsZUNvbHVtbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKQotI2lmICgkdGFibGUuYWNjZXNzID09ICJmaWVsZCIpCi0KLSNwYXJzZSgibWFwcGluZ0tpbmQudm0iKQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSR7Y29sdW1uLmZpZWxkU2NvcGV9ICR7Y29sdW1uLnNpbXBsZVByb3BlcnR5VHlwZX0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLSNlbmQKLSNmb3JlYWNoICgkcm9sZSBpbiAkdGFibGUuYXNzb2NpYXRpb25Sb2xlcykKLSMjIyMjCi0jIyMjIyBmaWVsZCBhbm5vdGF0aW9ucwotIyMjIyMKLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQotCi0JLy8ke3JvbGUuZGVzY3JpcHRpb259Ci0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIpCi0jcGFyc2UoIm1hbnlUb09uZS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1tYW55IikKLSNwYXJzZSgibWFueVRvTWFueS52bSIpCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW1hbnkiKQotI3BhcnNlKCJvbmVUb01hbnkudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQotI3BhcnNlKCJvbmVUb09uZS52bSIpCi0jZW5kCi0jZW5kCi0jIyMjIwotIyMjIyMgZmllbGQgZGVjbGFyYXRpb24KLSMjIyMjCi0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQotI3NldCAoJHByb3BlcnR5VHlwZSA9ICR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfSkKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gIiR7cm9sZS5yZWZlcmVuY2VkVGFibGUuc2ltcGxlQ29sbGVjdGlvblR5cGV9PCR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfT4iKQotI2VuZAotCXByaXZhdGUgJHByb3BlcnR5VHlwZSAkcm9sZS5wcm9wZXJ0eU5hbWU7Ci0jZW5kCi0KLSAgICBwdWJsaWMgJHt0YWJsZS5jbGFzc05hbWV9KCkgewotICAgIH0KLQotIyMjIyMKLSMjIyMjIHNpbXBsZSBwcm9wZXJ0aWVzIGdldHRlcnMgYW5kIHNldHRlcnMKLSMjIyMjCi0jaWYgKCR0YWJsZS5jb21wb3NpdGVLZXkpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotCUBFbWJlZGRlZElkCi0jZW5kCi0JcHVibGljICR0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWUgJGN1c3RvbWl6ZXIucHJvcGVydHlHZXR0ZXIoJHRhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7dGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCAkY3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkdGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lKSgkdGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lICR0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUpIHsKLQkJdGhpcy4ke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX0gPSAke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX07Ci0JfQotCQotI2VuZAotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHRhYmxlLmdldFNpbXBsZUNvbHVtbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKQotI2lmICgkdGFibGUuYWNjZXNzID09ICJwcm9wZXJ0eSIpCi0KLSNwYXJzZSgibWFwcGluZ0tpbmQudm0iKQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSRjb2x1bW4ucHJvcGVydHlHZXRTY29wZSAkY29sdW1uLnNpbXBsZVByb3BlcnR5VHlwZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotCi0JJGNvbHVtbi5wcm9wZXJ0eVNldFNjb3BlIHZvaWQgJGN1c3RvbWl6ZXIucHJvcGVydHlTZXR0ZXIoJGNvbHVtbi5wcm9wZXJ0eU5hbWUpKCRjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlICRjb2x1bW4ucHJvcGVydHlOYW1lKSB7Ci0JCXRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfSA9ICR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotCi0jZW5kCi0jIyMjIwotIyMjIyMgYXNzb2NpYXRpb25zIGdldHRlcnMgYW5kIHNldHRlcnMKLSMjIyMjCi0jZm9yZWFjaCAoJHJvbGUgaW4gJHRhYmxlLmFzc29jaWF0aW9uUm9sZXMpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotCS8vJHtyb2xlLmRlc2NyaXB0aW9ufQotI2lmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1vbmUiKQotI3BhcnNlKCJtYW55VG9PbmUudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tbWFueSIpCi0jcGFyc2UoIm1hbnlUb01hbnkudm0iKQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikKLSNwYXJzZSgib25lVG9NYW55LnZtIikKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tb25lIikKLSNwYXJzZSgib25lVG9PbmUudm0iKQotI2VuZAotI2VuZAotIyMKLSNpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tb25lIiB8fCAkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW9uZSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gJHJvbGUucmVmZXJlbmNlZFRhYmxlLmNsYXNzTmFtZSkKLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gIiR7cm9sZS5yZWZlcmVuY2VkVGFibGUuc2ltcGxlQ29sbGVjdGlvblR5cGV9PCR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfT4iKQotI2VuZAotCXB1YmxpYyAkcHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRyb2xlLnByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7cm9sZS5wcm9wZXJ0eU5hbWV9OwotCX0KLQotCXB1YmxpYyB2b2lkICR7Y3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkcm9sZS5wcm9wZXJ0eU5hbWUpfSgkcHJvcGVydHlUeXBlICRyb2xlLnByb3BlcnR5TmFtZSkgewotCQl0aGlzLiR7cm9sZS5wcm9wZXJ0eU5hbWV9ID0gJHJvbGUucHJvcGVydHlOYW1lOwotCX0KLQkKLSMjCi0jZW5kCi0jIwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9NYW55LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDgyYWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBNYW55VG9NYW55IGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQotIyMKLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCAmJiAhJHJvbGUuaXNSZWZlcnJlclJvbGUoKSkjI3RoZSBvd25pbmcgc2lkZSAoZWl0aGVyIHNpZGUgZm9yIG1hbnktdG8tbWFueSkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgIm1hcHBlZEJ5IiwgJHJvbGUub3Bwb3NpdGVSb2xlLnByb3BlcnR5TmFtZSwgdHJ1ZSkpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkxBWlkiKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQotI2VuZAotI2lmKCRtZW1iZXJzIT0iIikKLQlATWFueVRvTWFueSgkbWVtYmVycykKLSNlbHNlCQotICAgIEBNYW55VG9NYW55Ci0jZW5kICAgIAotI2Vsc2UKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuTEFaWSIpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBNYW55VG9NYW55KCRtZW1iZXJzKQotI2Vsc2UJCi0gICAgQE1hbnlUb01hbnkKLSNlbmQgICAgCi0jcGFyc2UoImpvaW4udm0iKQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb09uZS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb09uZS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNzliYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9PbmUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBNYW55VG9PbmUgYW5ub3RhdGlvbi4KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlCi0jIwotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQotI2lmKCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9ICIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0gIkZldGNoVHlwZS5FQUdFUiIpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBNYW55VG9PbmUoJG1lbWJlcnMpCi0jZWxzZQotICAgIEBNYW55VG9PbmUKLSNlbmQKLSNwYXJzZSgiam9pbi52bSIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFwcGluZ0tpbmQudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZDA1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQEJhc2ljLCBASWQsIEBWZXJzaW9uIGFubm90YXRpb25zLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgImNvbHVtbiIgb2JqZWN0Ci0jIwotI3NldCAoJG1hcHBpbmdLaW5kID0gJGNvbHVtbi5tYXBwaW5nS2luZCkKLSNpZiAoJG1hcHBpbmdLaW5kID09ICJpZCIpCi0JQElkCi0jc2V0ICgkaWRHZW5lcmF0b3IgPSAkdGFibGUuaWRHZW5lcmF0b3IpCi0jaWYgKCRpZEdlbmVyYXRvciA9PSAiYXV0byIpCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiR2VuZXJhdGlvblR5cGUuQVVUTyIpCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gImlkZW50aXR5IikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5JREVOVElUWSIpCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gInNlcXVlbmNlIikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSIpCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gInRhYmxlIikKLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5UQUJMRSIpCi0jZWxzZQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIiIpCi0jZW5kCi0jaWYgKCRpZEdlbmVyYXRvciA9PSAic2VxdWVuY2UiICkKLSNzZXQgKCRnZW5lcmF0b3JOYW1lID0gIiR7dGFibGUubmFtZS50b1VwcGVyQ2FzZSgpfV8ke2NvbHVtbi5wcm9wZXJ0eU5hbWUudG9VcHBlckNhc2UoKX1fR0VORVJBVE9SIikKLSNpZiggJHRhYmxlLmZvcm1hdHRlZFNlcXVlbmNlICE9ICIiICkKLQlAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT0iJGdlbmVyYXRvck5hbWUiLCBzZXF1ZW5jZU5hbWU9IiR0YWJsZS5mb3JtYXR0ZWRTZXF1ZW5jZSIpCi0jZWxzZQotCUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSIkZ2VuZXJhdG9yTmFtZSIgKQotI2VuZAkKLQlAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9JGdlbmVyYXRpb25UeXBlLCBnZW5lcmF0b3I9IiRnZW5lcmF0b3JOYW1lIikKLSNlbHNlaWYgKCRnZW5lcmF0aW9uVHlwZSAhPSAiIikKLQlAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9JGdlbmVyYXRpb25UeXBlKQotI2VuZCAgICAgIAotI2Vsc2VpZiAoJG1hcHBpbmdLaW5kID09ICJ2ZXJzaW9uIikKLQlAVmVyc2lvbgotI2Vsc2UKLSMjREVGQVVMVCBpcyBAQmFzaWMsIG5vIG5lZWQgdG8gZ2VuZXJhdGUKLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb01hbnkudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb01hbnkudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjE1Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9NYW55LnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBAT25lVG9NYW55IGFubm90YXRpb24uCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQotIyMKLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgIm1hcHBlZEJ5IiwgJHJvbGUub3Bwb3NpdGVSb2xlLnByb3BlcnR5TmFtZSwgdHJ1ZSkpCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpICE9IkZldGNoVHlwZS5MQVpZIikKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkKLSNlbmQKLQlAT25lVG9NYW55KCRtZW1iZXJzKQotI2Vsc2UKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkgIT0iRmV0Y2hUeXBlLkxBWlkiKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQotI2VuZAotCUBPbmVUb01hbnkoJG1lbWJlcnMpCi0jcGFyc2UoImpvaW4udm0iKQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvT25lLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9PbmUudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZDc1MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9PbmUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBPbmVUb09uZSBhbm5vdGF0aW9uLgotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUKLSMjCi0jaWYgKCRyb2xlLmFzc29jaWF0aW9uLmJpZGlyZWN0aW9uYWwgJiYgISRyb2xlLmlzUmVmZXJyZXJSb2xlKCkpIyN0aGUgb3duaW5nIHNpZGUgKGVpdGhlciBzaWRlIGZvciBvbmUtdG8tb25lKQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAibWFwcGVkQnkiLCAkcm9sZS5vcHBvc2l0ZVJvbGUucHJvcGVydHlOYW1lLCB0cnVlKSkKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkVBR0VSIiApCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0JQE9uZVRvT25lKCRtZW1iZXJzKQotI2Vsc2UKLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkKLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkVBR0VSIiApCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpCi0jZW5kCi0jaWYoJG1lbWJlcnMhPSIiKQotCUBPbmVUb09uZSgkbWVtYmVycykKLSNlbHNlCi0JQE9uZVRvT25lCi0jZW5kCi0jcGFyc2UoImpvaW4udm0iKQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9way5qYXZhLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODMxMDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jaWYgKCR0YWJsZS5wYWNrYWdlICE9ICIiKQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9OwotI2VuZAotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKLQotLyoqCi0gKiBUaGUgcHJpbWFyeSBrZXkgY2xhc3MgZm9yIHRoZSAke3RhYmxlLm5hbWV9IGRhdGFiYXNlIHRhYmxlLgotICogCi0gKi8KLUBFbWJlZGRhYmxlCi1wdWJsaWMgY2xhc3MgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkvL2RlZmF1bHQgc2VyaWFsIHZlcnNpb24gaWQsIHJlcXVpcmVkIGZvciBzZXJpYWxpemFibGUgY2xhc3Nlcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSMjIyMjCi0jIyMjIyBmaWVsZHMKLSMjIyMjCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUucHJpbWFyeUtleUNvbHVtbnMpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikKLQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSR7Y29sdW1uLmZpZWxkU2NvcGV9ICR7Y29sdW1uLnByb3BlcnR5VHlwZX0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsKLSNlbmQKLQotICAgIHB1YmxpYyAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0oKSB7Ci0gICAgfQotIyMjIyMKLSMjIyMjIHNpbXBsZSBwcm9wZXJ0aWVzIGdldHRlcnMgYW5kIHNldHRlcnMKLSMjIyMjCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUucHJpbWFyeUtleUNvbHVtbnMpCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikKLQotI3BhcnNlKCJjb2x1bW4udm0iKQotI2VuZAotCSRjb2x1bW4ucHJvcGVydHlHZXRTY29wZSAkY29sdW1uLnByb3BlcnR5VHlwZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoKSB7Ci0JCXJldHVybiB0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX07Ci0JfQotCSRjb2x1bW4ucHJvcGVydHlTZXRTY29wZSB2b2lkICRjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgkY29sdW1uLnByb3BlcnR5VHlwZSAkY29sdW1uLnByb3BlcnR5TmFtZSkgewotCQl0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX0gPSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9OwotCX0KLSNlbmQKLSMjCi0jIyBlcXVhbHMvaGFzaENvZGUKLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCSR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSBjYXN0T3RoZXIgPSAoJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9KW90aGVyOwotCQlyZXR1cm4gCi0JCQkke3RhYmxlLnByaW1hcnlLZXlFcXVhbHNDbGF1c2V9Ci0KLSAgICB9Ci0gICAgCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCBoYXNoID0gMTc7Ci0JCSR7dGFibGUucHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlfQotCQlyZXR1cm4gaGFzaDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyODYwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWIzODliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTViMmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MjIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM4MjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MzcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1ZjI5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHksCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudCwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lciwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFiOGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTBiMjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVhYmVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBVdGlsaXR5Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxOTQxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgR09GIENvbW1hbmQgZGVzaWduIHBhdHRlcm4sCi0gKiBhbmQgaXQgZG9lc24ndCBjYXJyeSB0aGUgYmFnZ2FnZSBvZiB7QGxpbmsgamF2YS5sYW5nLlJ1bm5hYmxlfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBjb21tYW5kCi0JICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBleGVjdXRlKCk7Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgaW50ZXJmYWNlIHRoYXQgd2lsbCBkbyBub3RoaW5nCi0JICogd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgQ29tbWFuZCwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJDb21tYW5kLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIHRocm93IGFuCi0JICogZXhjZXB0aW9uIHdoZW4gZXhlY3V0ZWQuCi0JICovCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQgaW1wbGVtZW50cyBDb21tYW5kLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ29tbWFuZC5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDI3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIHRvIGNvbnRyb2wgaG93IGEgY29tbWFuZCBpcyBleGVjdXRlZC4KLSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHNlcnZlciBwcm92aWRlcyB0aGUgY29tbWFuZCBidXQgdGhlIGNsaWVudCBwcm92aWRlcwotICogdGhlIGNvbnRleHQgKGUuZy4gdGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIGRpc3BhdGNoIHRoZSBjb21tYW5kIHRvIHRoZSBVSQotICogdGhyZWFkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEV4ZWN1dG9yIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqLwotCXZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpOwotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZXhlY3V0b3IgaW50ZXJmYWNlCi0JICogdGhhdCBzaW1wbHkgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgd2l0aG91dCBhbnkgc29ydCBvZiBlbmhhbmNlbWVudC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNvbW1hbmRFeGVjdXRvci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1ZWNiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIGZpbHRlciBvYmplY3RzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiBvYmplY3RzIHRvIGJlIGZpbHRlcmVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyPFQ+IHsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzICJhY2NlcHRlZCIgYnkgdGhlCi0JICogZmlsdGVyLiBUaGUgc2VtYW50aWNzIG9mICJhY2NlcHQiIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCWJvb2xlYW4gYWNjZXB0KFQgbyk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1ldGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgYWNjZXB0cyBhbGwgdGhlCi0JICogb2JqZWN0cyAoaS5lLiBpdCBkb2VzIG5vIGZpbHRlcmluZykuCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gbm90aGluZyBpcyBmaWx0ZXJlZCAtIGV2ZXJ5dGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFMgbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkZpbHRlci5OdWxsIjsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWV0YXRpb24gb2YgdGhlIGZpbHRlciBpbnRlcmZhY2UgdGhhdCBhY2NlcHRzIG5vbmUgb2YgdGhlCi0JICogb2JqZWN0cyAoaS5lLiBpdCBmaWx0ZXJzIG91dCBhbGwgdGhlIG9iamVjdHMpLgotCSAqLwotCWZpbmFsIGNsYXNzIE9wYXF1ZTxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBPcGFxdWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRmlsdGVyLk9wYXF1ZSI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1ldGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCSAqIGlmIGNhbGxlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkZpbHRlci5EaXNhYmxlZCI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0phdmFUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3NjljYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvSmF2YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgYSBKYXZhIHR5cGU7IGkuZS4gaXRzICJlbGVtZW50IHR5cGUiCi0gKiBhbmQgaXRzICJhcnJheSBkZXB0aCIuIFRoZSBlbGVtZW50IHR5cGUgaXMgcmVmZXJlbmNlZCBieSBuYW1lLAotICogYWxsb3dpbmcgdXMgdG8gcmVmZXJlbmNlIGNsYXNzZXMgdGhhdCBhcmUgbm90IChvciBjYW5ub3QgYmUpIGxvYWRlZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFUeXBlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSdzICJlbGVtZW50IHR5cGUiLgotCSAqIEEgbWVtYmVyIHR5cGUgd2lsbCBoYXZlIG9uZSBvciBtb3JlIDxjb2RlPickJzwvY29kZT4gY2hhcmFjdGVycyBpbiBpdHMgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyAiYXJyYXkgZGVwdGgiLgotCSAqLwotCWludCBnZXRBcnJheURlcHRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhbiBhcnJheSAoaS5lLiBpdHMgImFycmF5IGRlcHRoIiBpcyBncmVhdGVyCi0JICogdGhhbiB6ZXJvKS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInByaW1pdGl2ZSIgKGUuZy4gPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhICJwcmltaXRpdmUgd3JhcHBlciIgKGUuZy4ge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyfSwKLQkgKiB7QGxpbmsgamF2YS5sYW5nLkZsb2F0fSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JYm9vbGVhbiBpc1ByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInZhcmlhYmxlIHByaW1pdGl2ZSIgKGUuZy4gPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+LAotCSAqIGJ1dCBub3QgPGNvZGU+dm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IHZhcmlhYmxlcyBjYW5ub3QgYmUgZGVjbGFyZWQgPGNvZGU+dm9pZDwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInZhcmlhYmxlIHByaW1pdGl2ZSB3cmFwcGVyIiAoZS5nLgotCSAqIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlcn0sIHtAbGluayBqYXZhLmxhbmcuRmxvYXR9LAotCSAqIGJ1dCBub3Qge0BsaW5rIGphdmEubGFuZy5Wb2lkfSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gdmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCA8Y29kZT52b2lkPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSdzIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgbWF0Y2hlcyB0aGF0Ci0JICogcmV0dXJuZWQgYnkge0BsaW5rIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCl9Ci0JICogKGUuZy4gPGNvZGU+IltbSiI8L2NvZGU+LCA8Y29kZT4iW0xqYXZhLmxhbmcuT2JqZWN0OyI8L2NvZGU+LAotCSAqIDxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4pLgotCSAqLwotCVN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyRWxlbWVudFR5cGVOYW1lLCBpbnQgb3RoZXJBcnJheURlcHRoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGRlc2NyaWJlcyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBkZXNjcmliZXMoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBkZXNjcmliZXMgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCWJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoSmF2YVR5cGUgb3RoZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOjx1bD4KLQkgKiA8bGk+PGNvZGU+IltbSiI8L2NvZGU+ID0+IDxjb2RlPiJsb25nW11bXSI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4gPT4gPGNvZGU+ImphdmEudXRpbC5NYXAuRW50cnkiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JU3RyaW5nIGRlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6PHVsPgotCSAqIDxsaT48Y29kZT4iW1tKIjwvY29kZT4gPT4gPGNvZGU+ImxvbmdbXVtdIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEudXRpbC5NYXAkRW50cnkiPC9jb2RlPiA9PiA8Y29kZT4iamF2YS51dGlsLk1hcC5FbnRyeSI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQl2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTo8dWw+Ci0JICogPGxpPjxjb2RlPiJbW0oiPC9jb2RlPiA9PiA8Y29kZT4ibG9uZ1tdW10iPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS51dGlsLk1hcCRFbnRyeSI8L2NvZGU+ID0+IDxjb2RlPiJqYXZhLnV0aWwuTWFwLkVudHJ5IjwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXZvaWQgcHJpbnREZWNsYXJhdGlvbk9uKFByaW50V3JpdGVyIHB3KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L01ldGhvZFNpZ25hdHVyZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L01ldGhvZFNpZ25hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjMzYzdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9NZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgYSBKYXZhIG1ldGhvZCBzaWduYXR1cmU7IGkuZS4gaXRzICJuYW1lIgotICogYW5kIGl0cyAicGFyYW1ldGVyIHR5cGVzIi4gVGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgcmVmZXJlbmNlZCBieSBuYW1lLAotICogYWxsb3dpbmcgdXMgdG8gcmVmZXJlbmNlIGNsYXNzZXMgdGhhdCBhcmUgbm90IChvciBjYW5ub3QgYmUpIGxvYWRlZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFNpZ25hdHVyZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyIHR5cGVzLgotCSAqLwotCUphdmFUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGRlc2NyaWJlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlib29sZWFuIGRlc2NyaWJlcyhNZXRob2QgbWV0aG9kKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGVxdWFscyB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJOYW1lLCBKYXZhVHlwZVtdIG90aGVyUGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBzaWduYXR1cmUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE1ldGhvZFNpZ25hdHVyZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZTo8cD4KLQkgKiA8Y29kZT4iZm9vKGludCwgamF2YS5sYW5nLlN0cmluZykiPC9jb2RlPgotCSAqLwotCVN0cmluZyBnZXRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEFwcGVuZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlOjxwPgotCSAqIDxjb2RlPiJmb28oaW50LCBqYXZhLmxhbmcuU3RyaW5nKSI8L2NvZGU+Ci0JICovCi0Jdm9pZCBhcHBlbmRTaWduYXR1cmVUbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQotCS8qKgotCSAqIFByaW50IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QncyBzaWduYXR1cmU6PHA+Ci0JICogPGNvZGU+ImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIjwvY29kZT4KLQkgKi8KLQl2b2lkIHByaW50U2lnbmF0dXJlT24oUHJpbnRXcml0ZXIgcHcpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Fic3RyYWN0QXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhYzdmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBJbXBsZW1lbnQgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiBBc3NvY2lhdGlvbiB0aGF0IGNhbgotICogYmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXNzb2NpYXRpb248SywgVj4KLQlpbXBsZW1lbnRzIEFzc29jaWF0aW9uPEssIFY+Ci17Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEFzc29jaWF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQXNzb2NpYXRpb248PywgPz4pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQXNzb2NpYXRpb248PywgPz4gb3RoZXIgPSAoQXNzb2NpYXRpb248PywgPz4pIG87Ci0JCXJldHVybiAodGhpcy5rZXkoKSA9PSBudWxsID8KLQkJCQkJb3RoZXIua2V5KCkgPT0gbnVsbCA6IHRoaXMua2V5KCkuZXF1YWxzKG90aGVyLmtleSgpKSkKLQkJCSYmICh0aGlzLnZhbHVlKCkgPT0gbnVsbCA/Ci0JCQkJCW90aGVyLnZhbHVlKCkgPT0gbnVsbCA6IHRoaXMudmFsdWUoKS5lcXVhbHMob3RoZXIudmFsdWUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMua2V5KCkgPT0gbnVsbCA/IDAgOiB0aGlzLmtleSgpLmhhc2hDb2RlKCkpCi0JCQleICh0aGlzLnZhbHVlKCkgPT0gbnVsbCA/IDAgOiB0aGlzLnZhbHVlKCkuaGFzaENvZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmtleSgpICsgIiA9PiAiICsgdGhpcy52YWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0FycmF5VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwZjE1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKioKLSAqIEFycmF5LXJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlUb29scyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0NIQVJfQVJSQVkgPSBuZXcgY2hhclswXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX0lOVF9BUlJBWSA9IG5ldyBpbnRbMF07Ci0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGgKLQkgKiBhbmQgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiBBcnJheXMubmV3QXJyYXkoT2JqZWN0W10gYXJyYXksIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5KEVbXSBhcnJheSwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3QXJyYXkoY29tcG9uZW50VHlwZShhcnJheSksIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYXJyYXkncyBjb21wb25lbnQgdHlwZSwgd2l0aCBhcHByb3ByaWF0ZSBzdXBwb3J0Ci0JICogZm9yIGdlbmVyaWNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlKEVbXSBhcnJheSkgewotCQlDbGFzczw/PiByYXdDb21wb25lbnRUeXBlID0gYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZSA9IChDbGFzczw/IGV4dGVuZHMgRT4pIHJhd0NvbXBvbmVudFR5cGU7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IHR5cGUgYW5kIGxlbmd0aCwKLQkgKiB3aXRoIGFwcHJvcHJpYXRlIHN1cHBvcnQgZm9yIGdlbmVyaWNzLiBUaGUgY29tcG9uZW50IHR5cGUgY2Fubm90IGJlIGEKLQkgKiBwcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbmV3QXJyYXkoQ2xhc3M8PyBleHRlbmRzIEU+IGNvbXBvbmVudFR5cGUsIGludCBsZW5ndGgpIHsKLQkJaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgY2xhc3MgY2Fubm90IGJlIHByaW1pdGl2ZTogIiArIGNvbXBvbmVudFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ld0FycmF5Xyhjb21wb25lbnRUeXBlLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgY29tcG9uZW50IHR5cGUgaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheV8oQ2xhc3M8PyBleHRlbmRzIEU+IGNvbXBvbmVudFR5cGUsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIChFW10pICgoY29tcG9uZW50VHlwZSA9PSBPQkpFQ1RfQ0xBU1MpID8KLQkJCQluZXcgT2JqZWN0W2xlbmd0aF0gOgotCQkJCUFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIGxlbmd0aCkpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczxPYmplY3Q+IE9CSkVDVF9DTEFTUyA9IE9iamVjdC5jbGFzczsKLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9BcnJheSgpPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9BcnJheSgpPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBpdGVyYWJsZSBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhlIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoT2JqZWN0W10pPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBpdGVyYWJsZSBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhlIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvQXJyYXkoKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvcikudG9BcnJheSgpIDoKLQkJCQlFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvQXJyYXkoKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKS50b0FycmF5KCkgOgotCQkJCUVNUFRZX09CSkVDVF9BUlJBWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgaXRlcmF0b3IgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoZSBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpLnRvQXJyYXkoYXJyYXkpIDoKLQkJCQllbXB0eUFycmF5KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgaXRlcmF0b3IgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoZSBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvQXJyYXkoT2JqZWN0W10pPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKS50b0FycmF5KGFycmF5KSA6Ci0JCQkJZW1wdHlBcnJheShhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBhcnJheSBpcyBlbXB0eSwgcmV0dXJuIGl0OwotCSAqIG90aGVyd2lzZSwgc2V0IGl0cyBmaXJzdCBlbGVtZW50IHRvIG51bGwuCi0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBlbXB0eUFycmF5KEVbXSBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGFycmF5IDogY2xlYXJGaXJzdChhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgYXJyYXkncyBmaXJzdCBlbGVtZW50IHRvIG51bGwgYW5kIGFuZCByZXR1cm4gdGhlIGFycmF5LgotCSAqIEFzc3VtZSB0aGUgYXJyYXkgbGVuZ3RoID4gMC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGNsZWFyRmlyc3QoRVtdIGFycmF5KSB7Ci0JCWFycmF5WzBdID0gbnVsbDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byBiZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZChFW10gYXJyYXksIEUgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBsZW4gKyAxKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXN1bHRbbGVuXSA9IHZhbHVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGQoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEUgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBsZW4gKyAxKTsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJcmVzdWx0W2luZGV4XSA9IHZhbHVlOwotCQlpZiAoaW5kZXggPCBsZW4pIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIGJlIGFkZGVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGQoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW4gKyAxXTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXN1bHRbbGVuXSA9IHZhbHVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChjaGFyW10gYXJyYXksIGludCBpbmRleCwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkKGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBjaGFyIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW4gKyAxXTsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJcmVzdWx0W2luZGV4XSA9IHZhbHVlOwotCQlpZiAoaW5kZXggPCBsZW4pIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIGJlIGFkZGVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBhZGQoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbiArIDFdOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBhZGQoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbGVuICsgMV07Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGluZGV4IDwgbGVuKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgY29sbGVjdGlvbiBzaXplCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJcmV0dXJuIChjb2xsZWN0aW9uU2l6ZSA9PSAwKSA/IGFycmF5IDogYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gc2l6ZSA+IHplcm8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgY29sbGVjdGlvbiwgYXJyYXkubGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gc2l6ZSA+IHplcm87IGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/Ci0JCQkJY29sbGVjdGlvbi50b0FycmF5KG5ld0FycmF5KGFycmF5LCBjb2xsZWN0aW9uU2l6ZSkpIDoKLQkJCQlhZGRBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggYW5kIGNvbGxlY3Rpb24gc2l6ZSA+IHplcm8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGFycmF5TGVuZ3RoICsgY29sbGVjdGlvblNpemUpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGFycmF5TGVuZ3RoKTsKLQkJaW50IGkgPSBhcnJheUxlbmd0aDsKLQkJZm9yIChFIGVsZW1lbnQgOiBjb2xsZWN0aW9uKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gYWRkQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSAxIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEUuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkyIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5MSwgYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheTEsIGludCBpbmRleCwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRS4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPwotCQkJCQlhcnJheTIgOgotCQkJCQkoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyAnYXJyYXkyJyBhZGRlZCB0byBlbmQgb2YgJ2FycmF5MScKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKSA6Ci0JCQkJCQlhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwIGFuZCBpbmRleCAhPSBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5MSwgYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgYXJyYXkyTGVuZ3RoLCBhcnJheTFMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbiBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgY29sbGVjdGlvbiBzaXplCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gKGNvbGxlY3Rpb25TaXplID09IDApID8gYXJyYXkgOiBhZGRBbGxfKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIHNpemUgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGFycmF5Lmxlbmd0aCwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIHNpemUgPiAwOyBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGNvbGxlY3Rpb24udG9BcnJheShuZXdBcnJheShhcnJheSwgY29sbGVjdGlvblNpemUpKTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gKGluZGV4ID09IGFycmF5TGVuZ3RoKSA/ICAvLyAnY29sbGVjdGlvbicgYWRkZWQgdG8gZW5kIG9mICdhcnJheScKLQkJCQlhZGRBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCwgY29sbGVjdGlvblNpemUpIDoKLQkJCQlhZGRBbGxfKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoIGFuZCBjb2xsZWN0aW9uIHNpemUgPiAwIGFuZCBpbmRleCAhPSBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgYXJyYXlMZW5ndGggKyBjb2xsZWN0aW9uU2l6ZSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlpbnQgaSA9IGluZGV4OwotCQlmb3IgKEUgaXRlbSA6IGNvbGxlY3Rpb24pIHsKLQkJCXJlc3VsdFtpKytdID0gaXRlbTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGNvbGxlY3Rpb25TaXplLCBhcnJheUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oYXJyYXksIGluZGV4LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvcikpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gYWRkQWxsXyhhcnJheSwgaW5kZXgsIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsXyhhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbF8oY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkyIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbF8oY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQkJYXJyYXkyIDoKLQkJCQkJKGluZGV4ID09IGFycmF5MUxlbmd0aCkgPyAgLy8gJ2FycmF5MicgYWRkZWQgdG8gZW5kIG9mICdhcnJheTEnCi0JCQkJCQlhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCkgOgotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgaW5kZXgsIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGFycmF5Mkxlbmd0aCwgYXJyYXkxTGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsXyhpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkyIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsXyhpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludC4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsXyhpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPwotCQkJCQlhcnJheTIgOgotCQkJCQkoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyAnYXJyYXkyJyBhZGRlZCB0byBlbmQgb2YgJ2FycmF5MScKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKSA6Ci0JCQkJCQlhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwIGFuZCBpbmRleCAhPSBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgaW5kZXgsIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGFycmF5Mkxlbmd0aCwgYXJyYXkxTGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgd2l0aCB0aGUgc2FtZSBjb21wb25lbnQgdHlwZSBhcyB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jbGVhcihPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGNsZWFyKEVbXSBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGFycmF5IDogbmV3QXJyYXkoYXJyYXksIDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25jYXRlbmF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluIGFsbCB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXlzLCBjb25jYXRlbmF0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgY29uc3RhbnQgYXJyYXlzIG91dCBvZiBvdGhlciBjb25zdGFudCBhcnJheXMuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbmNhdGVuYXRlKE9iamVjdFtdLi4uIGFycmF5cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGNvbmNhdGVuYXRlKEVbXS4uLiBhcnJheXMpIHsKLQkJaW50IGxlbiA9IDA7Ci0JCWZvciAoRVtdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlsZW4gKz0gYXJyYXkubGVuZ3RoOwotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheXNbMF0sIGxlbik7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpbnQgY3VycmVudCA9IDA7Ci0JCWZvciAoRVtdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCQlpZiAoYXJyYXlMZW5ndGggPiAwKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCBjdXJyZW50LCBhcnJheUxlbmd0aCk7Ci0JCQkJY3VycmVudCArPSBhcnJheUxlbmd0aDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gIGFsbCB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXlzLCBjb25jYXRlbmF0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgY29uc3RhbnQgYXJyYXlzIG91dCBvdGhlciBjb25zdGFudCBhcnJheXMuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbmNhdGVuYXRlKGNoYXJbXS4uLiBhcnJheXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbmNhdGVuYXRlKGNoYXJbXS4uLiBhcnJheXMpIHsKLQkJaW50IGxlbiA9IDA7Ci0JCWZvciAoY2hhcltdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlsZW4gKz0gYXJyYXkubGVuZ3RoOwotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCWludCBjdXJyZW50ID0gMDsKLQkJZm9yIChjaGFyW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJCWlmIChhcnJheUxlbmd0aCAhPSAwKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCBjdXJyZW50LCBhcnJheUxlbmd0aCk7Ci0JCQkJY3VycmVudCArPSBhcnJheUxlbmd0aDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gIGFsbCB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXlzLCBjb25jYXRlbmF0ZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgY29uc3RhbnQgYXJyYXlzIG91dCBvdGhlciBjb25zdGFudCBhcnJheXMuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbmNhdGVuYXRlKGludFtdLi4uIGFycmF5cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBjb25jYXRlbmF0ZShpbnRbXS4uLiBhcnJheXMpIHsKLQkJaW50IGxlbiA9IDA7Ci0JCWZvciAoaW50W10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWxlbiArPSBhcnJheS5sZW5ndGg7Ci0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSU5UX0FSUkFZOwotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbGVuXTsKLQkJaW50IGN1cnJlbnQgPSAwOwotCQlmb3IgKGludFtdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCQlpZiAoYXJyYXlMZW5ndGggIT0gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgY3VycmVudCwgYXJyYXlMZW5ndGgpOwotCQkJCWN1cnJlbnQgKz0gYXJyYXlMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbnRhaW5zXyhhcnJheSwgdmFsdWUsIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc18oT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGFycmF5LCB2YWx1ZSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbnRhaW5zXyhhcnJheSwgdmFsdWUsIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGFycmF5LCB2YWx1ZSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGludFtdIGFycmF5LCBpbnQgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gZmFsc2UgOiBjb250YWluc18oYXJyYXksIHZhbHVlLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zXyhpbnRbXSBhcnJheSwgaW50IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGFycmF5LCBjb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQkvLyB1c2UgaGFzaGVkIGxvb2t1cAotCQlIYXNoU2V0PE9iamVjdD4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldChhcnJheSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmICggISBzZXQuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdC4uLiBhcnJheTIpIHsKLQkJLy8gdXNlIGhhc2hlZCBsb29rdXAKLQkJSGFzaFNldDxPYmplY3Q+IHNldCA9IENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkxKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5Mi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIHNldC5jb250YWlucyhhcnJheTJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoY2hhcltdIGFycmF5MSwgY2hhci4uLiBhcnJheTIpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Mi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MSwgYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChpbnRbXSBhcnJheTEsIGludC4uLiBhcnJheTIpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Mi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MSwgYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGFycmF5LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZFbmQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGxlbjEgPSBhcnJheTEubGVuZ3RoOwotCQlpbnQgbGVuMiA9IGFycmF5Mi5sZW5ndGg7Ci0JCWlmIChsZW4xICE9IGxlbjIpIHsKLQkJCXJldHVybiBNYXRoLm1heChsZW4xLCBsZW4yKSAtIDE7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjEgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG8gPSBhcnJheTFbaV07Ci0JCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkJaWYgKGFycmF5MltpXSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhIG8uZXF1YWxzKGFycmF5MltpXSkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoKX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogQHNlZSAjZGlmZlN0YXJ0KE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKiBAc2VlICNkaWZmRW5kKE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGRpZmZSYW5nZShPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgZW5kID0gZGlmZkVuZChhcnJheTEsIGFycmF5Mik7Ci0JCWlmIChlbmQgPT0gLTEpIHsKLQkJCS8vIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCB0aGUgc3RhcnQgaXMgdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cwotCQkJcmV0dXJuIG5ldyBSYW5nZShhcnJheTEubGVuZ3RoLCBlbmQpOwotCQl9Ci0JCS8vIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50LCBjYWxjdWxhdGUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotCQlyZXR1cm4gbmV3IFJhbmdlKGRpZmZTdGFydChhcnJheTEsIGFycmF5MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoKX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlmZlN0YXJ0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQ7IGkrKykgewotCQkJT2JqZWN0IG8gPSBhcnJheTFbaV07Ci0JCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkJaWYgKGFycmF5MltpXSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhIG8uZXF1YWxzKGFycmF5MltpXSkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBhcnJheS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZkVuZChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgbGVuMSA9IGFycmF5MS5sZW5ndGg7Ci0JCWludCBsZW4yID0gYXJyYXkyLmxlbmd0aDsKLQkJaWYgKGxlbjEgIT0gbGVuMikgewotCQkJcmV0dXJuIE1hdGgubWF4KGxlbjEsIGxlbjIpIC0gMTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuMSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlpZiAoYXJyYXkxW2ldICE9IGFycmF5MltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKiBAc2VlICNpZGVudGl0eURpZmZTdGFydChPYmplY3RbXSwgT2JqZWN0W10pCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmRW5kKE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBlbmQgPSBpZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpOwotCQlpZiAoZW5kID09IC0xKSB7Ci0JCQkvLyB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgdGhlIHN0YXJ0IGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMKLQkJCXJldHVybiBuZXcgUmFuZ2UoYXJyYXkxLmxlbmd0aCwgZW5kKTsKLQkJfQotCQkvLyB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCwgY2FsY3VsYXRlIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UKLQkJcmV0dXJuIG5ldyBSYW5nZShpZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgZW5kID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kOyBpKyspIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5cyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pZGVudGljYWwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUlkZW50aWNhbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpZiAoYXJyYXkxID09IGFycmF5MikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFycmF5MSA9PSBudWxsIHx8IGFycmF5MiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCWlmIChhcnJheTIubGVuZ3RoICE9IGxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5MVtpXSAhPSBhcnJheTJbaV0pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaWRlbnRpdHlJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0aW9uIGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpbnQgbGVuID0gc29ydGVkQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZEFycmF5W2ldKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgRSB2YWx1ZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJaW50IGxlbiA9IHNvcnRlZEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkQXJyYXlbaV0pIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXk7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxhc3RJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGFzdEluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxhc3RJbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbi9tYXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1pbmltdW0gdmFsdWUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1pbihjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBtaW4oY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGxhc3QgPSBsZW4gLSAxOwotCQljaGFyIG1pbiA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQljaGFyIGMgPSBhcnJheVtpXTsKLQkJCWlmIChjIDwgbWluKSB7Ci0JCQkJbWluID0gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWluaW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWluKGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWludCBtaW4gPSBhcnJheVtsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJaW50IHggPSBhcnJheVtpXTsKLQkJCWlmICh4IDwgbWluKSB7Ci0JCQkJbWluID0geDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tYXgoY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgbWF4KGNoYXIuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJY2hhciBtYXggPSBhcnJheVtsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJY2hhciBjID0gYXJyYXlbaV07Ci0JCQlpZiAoYyA+IG1heCkgewotCQkJCW1heCA9IGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGludGVnZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1heGltdW0gdmFsdWUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1heChpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbWF4KGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGxhc3QgPSBsZW4gLSAxOwotCQlpbnQgbWF4ID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWludCB4ID0gYXJyYXlbaV07Ci0JCQlpZiAoeCA+IG1heCkgewotCQkJCW1heCA9IHg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW92ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1vdmUoT2JqZWN0W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbW92ZShFW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0IGluZGV4ICE9IHNvdXJjZSBpbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gbW92ZV8oRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlFIHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1vdmUoT2JqZWN0W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbW92ZShFW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlFW10gdGVtcCA9IG5ld0FycmF5KGFycmF5LCBsZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIG1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBtb3ZlXyhpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaW50IHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIG1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlpbnRbXSB0ZW1wID0gbmV3IGludFtsZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1vdmUoY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gbW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gbW92ZV8oY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQljaGFyIHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1vdmUoY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gbW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQljaGFyW10gdGVtcCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmUoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZShFW10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmUoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmUoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZShpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZShpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRmlyc3QoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVGaXJzdChFW10gYXJyYXkpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRmlyc3QoY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVGaXJzdChjaGFyW10gYXJyYXkpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRmlyc3QoaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRmlyc3QoaW50W10gYXJyYXkpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGxhc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVMYXN0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlTGFzdChFW10gYXJyYXkpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBhcnJheS5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGxhc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVMYXN0KGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlTGFzdChjaGFyW10gYXJyYXkpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBhcnJheS5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGxhc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVMYXN0KGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUxhc3QoaW50W10gYXJyYXkpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBhcnJheS5sZW5ndGggLSAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJLy8gY29udmVydCB0byBhIHNldCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gcmVtb3ZlQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYXRvcikpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCS8vIGNvbnZlcnQgdG8gYSBzZXQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IHJlbW92ZUFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5zZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24uaXNFbXB0eSgpID8gYXJyYXkgOiByZW1vdmVBbGxfKGFycmF5LCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChhcnJheSwgY29sbGVjdGlvbiwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHk7IGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmVtb3ZlQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eSBhbmQgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCS8vIGJ1aWxkIHRoZSBpbmRpY2VzIG9mIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byByZW1haW4KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbGxlY3Rpb24uY29udGFpbnMoYXJyYXlbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheTEsIE9iamVjdC4uLiBhcnJheTIpIHsKLQkJLy8gY29udmVydCB0byBhIHNldCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlyZXR1cm4gKGFycmF5Mi5sZW5ndGggPT0gMCkgPyBhcnJheTEgOiByZW1vdmVBbGxfKGFycmF5MSwgQ29sbGVjdGlvblRvb2xzLnNldChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzI3JlbW92ZUFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGwoY2hhcltdIGFycmF5MSwgY2hhci4uLiBhcnJheTIpIHsKLQkJaWYgKGFycmF5Mi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJaWYgKGFycmF5MUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MiwgYXJyYXkxW2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMjcmVtb3ZlQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludC4uLiBhcnJheTIpIHsKLQkJaWYgKGFycmF5Mi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJaWYgKGFycmF5MUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MiwgYXJyYXkxW2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCBvY2N1cnJlbmNlcyBvZgotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhFW10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSAhPSBudWxsKSB7Ci0JCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKCAhIHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGopOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCBvY2N1cnJlbmNlcyBvZgotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSAhPSB2YWx1ZSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSAhPSB2YWx1ZSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGR1cGxpY2F0ZSBlbGVtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgYW55IGR1cGxpY2F0ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlBcnJheUxpc3Q8RT4gdGVtcCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGFycmF5KTsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyh0ZW1wLCBsZW4pID8KLQkJCQkJdGVtcC50b0FycmF5KG5ld0FycmF5KGFycmF5LCB0ZW1wLnNpemUoKSkpIDoKLQkJCQkJYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50IGF0IGluZGV4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudEF0SW5kZXgoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRBdEluZGV4KEVbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50QXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUVsZW1lbnRBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudHMgYXQgaW5kZXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudHNBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoRVtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbmV3TGVuZ3RoKTsKLQkJaWYgKChuZXdMZW5ndGggPT0gMCkgJiYgKGluZGV4ID09IDApKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJaW50IGxlbmd0aDIgPSBuZXdMZW5ndGggLSBpbmRleDsKLQkJaWYgKGxlbmd0aDIgIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIGxlbmd0aDIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUVsZW1lbnRzQXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJaWYgKChuZXdMZW5ndGggPT0gMCkgJiYgKGluZGV4ID09IDApKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW25ld0xlbmd0aF07Ci0JCWlmIChpbmRleCAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlpbnQgbGVuZ3RoMiA9IG5ld0xlbmd0aCAtIGluZGV4OwotCQlpZiAobGVuZ3RoMiAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoMik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUVsZW1lbnRzQXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaW50IG5ld0xlbmd0aCA9IGFycmF5TGVuZ3RoIC0gbGVuZ3RoOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiBFTVBUWV9JTlRfQVJSQVk7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbmV3TGVuZ3RoXTsKLQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCWludCBsZW5ndGgyID0gbmV3TGVuZ3RoIC0gaW5kZXg7Ci0JCWlmIChsZW5ndGgyICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgbGVuZ3RoLCByZXN1bHQsIGluZGV4LCBsZW5ndGgyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXBsYWNlIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVwbGFjZUFsbChPYmplY3RbXSBhcnJheSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXBsYWNlQWxsKEVbXSBhcnJheSwgT2JqZWN0IG9sZFZhbHVlLCBFIG5ld1ZhbHVlKSB7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChvbGRWYWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKjxwPgotCSAqIDxjb2RlPiBBcnJheXMucmVwbGFjZUFsbChpbnRbXSBhcnJheSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVwbGFjZUFsbChpbnRbXSBhcnJheSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gb2xkVmFsdWUpIHsKLQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVwbGFjZUFsbChjaGFyW10gYXJyYXksIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IG9sZFZhbHVlKSB7Ci0JCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBhcnJheUxlbmd0aCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBhcnJheUxlbmd0aCwgaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIGludCBhcnJheUxlbmd0aCwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJcmV0YWluQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYXRvciksIGFycmF5TGVuZ3RoKSA6Ci0JCQkJbmV3QXJyYXkoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBpbnQgYXJyYXlMZW5ndGgsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCXJldGFpbkFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5zZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSksIGFycmF5TGVuZ3RoKSA6Ci0JCQkJbmV3QXJyYXkoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gY29sbGVjdGlvbi5pc0VtcHR5KCkgPwotCQkJCW5ld0FycmF5KGFycmF5LCAwKSA6Ci0JCQkJcmV0YWluQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eSBhbmQgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJYXJyYXkxIDoKLQkJCQkoYXJyYXkyLmxlbmd0aCA9PSAwKSA/Ci0JCQkJCW5ld0FycmF5KGFycmF5MSwgMCkgOgotCQkJCQlyZXRhaW5BbGwoYXJyYXkxLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5MiksIGFycmF5MUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IEVNUFRZX0NIQVJfQVJSQVkgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250YWluc18oYXJyYXkyLCBhcnJheTFbaV0sIGFycmF5Mkxlbmd0aCkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTEgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDEgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCkgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBFTVBUWV9JTlRfQVJSQVkgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250YWluc18oYXJyYXkyLCBhcnJheTFbaV0sIGFycmF5Mkxlbmd0aCkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXksIHJldmVyc2VkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXZlcnNlKE9iamVjdC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldmVyc2UoRS4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5LCByZXZlcnNlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV2ZXJzZShjaGFyLi4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZXZlcnNlKGNoYXIuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSwgcmV2ZXJzZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldmVyc2UoaW50Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJldmVyc2UoaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByb3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcm90YXRlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShPYmplY3RbXSBhcnJheSwgaW50IGRpc3RhbmNlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcm90YXRlKEVbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlFIGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQlFIHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJvdGF0ZShjaGFyLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoY2hhcltdIGFycmF5LCBpbnQgZGlzdGFuY2UpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJvdGF0ZShjaGFyW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJY2hhciBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJY2hhciB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcm90YXRlKGludC4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGludFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcm90YXRlKGludFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCWludCBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJaW50IHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaHVmZmxlICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBSQU5ET00gPSBuZXcgUmFuZG9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zaHVmZmxlKE9iamVjdC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNodWZmbGUoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gc2h1ZmZsZShhcnJheSwgUkFORE9NKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zaHVmZmxlKE9iamVjdFtdIGFycmF5LCBSYW5kb20gcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNodWZmbGUoRVtdIGFycmF5LCBSYW5kb20gcmFuZG9tKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN3YXAoYXJyYXksIGksIHJhbmRvbS5uZXh0SW50KGxlbikpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zaHVmZmxlKGNoYXIuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNodWZmbGUoY2hhci4uLiBhcnJheSkgewotCQlyZXR1cm4gc2h1ZmZsZShhcnJheSwgUkFORE9NKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zaHVmZmxlKGNoYXJbXSBhcnJheSwgUmFuZG9tIHIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNodWZmbGUoY2hhcltdIGFycmF5LCBSYW5kb20gcmFuZG9tKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN3YXAoYXJyYXksIGksIHJhbmRvbS5uZXh0SW50KGxlbikpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zaHVmZmxlKGludC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzaHVmZmxlKGludC4uLiBhcnJheSkgewotCQlyZXR1cm4gc2h1ZmZsZShhcnJheSwgUkFORE9NKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zaHVmZmxlKGludFtdIGFycmF5LCBSYW5kb20gcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzaHVmZmxlKGludFtdIGFycmF5LCBSYW5kb20gcmFuZG9tKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN3YXAoYXJyYXksIGksIHJhbmRvbS5uZXh0SW50KGxlbikpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWFycmF5ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggZWxlbWVudHMgY29waWVkIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgImZyb20iIGluZGV4IGlzIGluY2x1c2l2ZTsgdGhlICJ0byIgaW5kZXggaXMgZXhjbHVzaXZlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zdWJBcnJheShFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc3ViQXJyYXkoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlpbnQgbGVuID0gdG9JbmRleCAtIGZyb21JbmRleDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBsZW4pOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgZnJvbUluZGV4LCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIGVsZW1lbnRzIGNvcGllZCBmcm9tCi0JICogdGhlIHNwZWNpZmllZCByYW5nZS4gVGhlICJmcm9tIiBpbmRleCBpcyBpbmNsdXNpdmU7IHRoZSAidG8iIGluZGV4IGlzIGV4Y2x1c2l2ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3ViQXJyYXkoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHN1YkFycmF5KGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlpbnQgbGVuID0gdG9JbmRleCAtIGZyb21JbmRleDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSU5UX0FSUkFZOwotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbGVuXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgZnJvbUluZGV4LCByZXN1bHQsIDAsIGxlbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCBlbGVtZW50cyBjb3BpZWQgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSAiZnJvbSIgaW5kZXggaXMgaW5jbHVzaXZlOyB0aGUgInRvIiBpbmRleCBpcyBleGNsdXNpdmUuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogQXJyYXlzLnN1YkFycmF5KGNoYXJbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpPC9jb2RlPgotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzdWJBcnJheShjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsZW4gPSB0b0luZGV4IC0gZnJvbUluZGV4OwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBmcm9tSW5kZXgsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3dhcCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3dhcChPYmplY3RbXSBhcnJheSwgaW50IGksIGludCBqKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc3dhcChFW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlyZXR1cm4gKGkgPT0gaikgPyBhcnJheSA6IHN3YXBfKGFycmF5LCBpLCBqKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGluZGljZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gc3dhcF8oRVtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJRSB0ZW1wID0gYXJyYXlbaV07Ci0JCWFycmF5W2ldID0gYXJyYXlbal07Ci0JCWFycmF5W2pdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zd2FwKGNoYXJbXSBhcnJheSwgaW50IGksIGludCBqKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzd2FwKGNoYXJbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCXJldHVybiAoaSA9PSBqKSA/IGFycmF5IDogc3dhcF8oYXJyYXksIGksIGopOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaW5kaWNlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHN3YXBfKGNoYXJbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCWNoYXIgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3dhcChpbnRbXSBhcnJheSwgaW50IGksIGludCBqKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHN3YXAoaW50W10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlyZXR1cm4gKGkgPT0gaikgPyBhcnJheSA6IHN3YXBfKGFycmF5LCBpLCBqKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGluZGljZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHN3YXBfKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJaW50IHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFycmF5cyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGJvb2xlYW5bXSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBmaWxsKGJvb2xlYW5bXSBhcnJheSwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGJvb2xlYW5bXSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuW10gZmlsbChib29sZWFuW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBib29sZWFuIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChieXRlW10sIGJ5dGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZmlsbChieXRlW10gYXJyYXksIGJ5dGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChieXRlW10sIGludCwgaW50LCBieXRlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZpbGwoYnl0ZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoY2hhcltdLCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZpbGwoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoY2hhcltdLCBpbnQsIGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmaWxsKGNoYXJbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGNoYXIgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGRvdWJsZVtdLCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBkb3VibGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChkb3VibGVbXSwgaW50LCBpbnQsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGZpbGwoZG91YmxlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBkb3VibGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGZsb2F0W10sIGZsb2F0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBmaWxsKGZsb2F0W10gYXJyYXksIGZsb2F0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZmxvYXRbXSwgaW50LCBpbnQsIGZsb2F0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBmaWxsKGZsb2F0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBmbG9hdCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoaW50W10sIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGZpbGwoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGludFtdLCBpbnQsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gZmlsbChpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGludCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoT2JqZWN0W10sIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gZmlsbChFW10gYXJyYXksIEUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChPYmplY3RbXSwgaW50LCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gZmlsbChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBFIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChsb25nW10sIGxvbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gZmlsbChsb25nW10gYXJyYXksIGxvbmcgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChsb25nW10sIGludCwgaW50LCBsb25nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGZpbGwobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoc2hvcnRbXSwgc2hvcnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIGZpbGwoc2hvcnRbXSBhcnJheSwgc2hvcnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChzaG9ydFtdLCBpbnQsIGludCwgc2hvcnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIGZpbGwoc2hvcnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIHNob3J0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChieXRlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gc29ydChieXRlLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNvcnQoYnl0ZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChjaGFyW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc29ydChjaGFyLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNvcnQoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChkb3VibGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIHNvcnQoZG91YmxlLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChkb3VibGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBzb3J0KGRvdWJsZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChmbG9hdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBzb3J0KGZsb2F0Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChmbG9hdFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gc29ydChmbG9hdFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChpbnRbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNvcnQoaW50Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChpbnRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzb3J0KGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChPYmplY3RbXSwgQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChPYmplY3RbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChPYmplY3RbXSwgaW50LCBpbnQsIENvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQobG9uZ1tdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNvcnQobG9uZy4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQobG9uZ1tdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBzb3J0KGxvbmdbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoc2hvcnRbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gc29ydChzaG9ydC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoc2hvcnRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIHNvcnQoc2hvcnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEFycmF5VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxMzBlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGRlZmluaXRpb24gb2YgYW4gb2JqZWN0IHBhaXJpbmcuCi0gKiBUaGUga2V5IGlzIGltbXV0YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbjxLLCBWPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3Mga2V5LgotCSAqLwotCUsga2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3MgdmFsdWUuCi0JICovCi0JViB2YWx1ZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBhc3NvY2lhdGlvbidzIHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JViBzZXRWYWx1ZShWIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGJvdGggdGhlIGFzc29jaWF0aW9ucycga2V5cyBhbmQgdmFsdWVzCi0JICogYXJlIGVxdWFsLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgYXNzb2NpYXRpb24ncwotCSAqIGtleSBhbmQgdmFsdWUuCi0JICovCi0JaW50IGhhc2hDb2RlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNmM5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGV4ZWN1dG9yIHdpbGwgZGlzcGF0Y2ggY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgaW4gYSBzZXBhcmF0ZQotICogdGhyZWFkLCBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yI2V4ZWN1dGUoQ29tbWFuZCl9IHRvIHJldHVybgotICogaW1tZWRpYXRlbHkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZHMgc2hvdWxkIGhhbmRsZSBhbnkKLSAqIGV4Y2VwdGlvbiBhcHByb3ByaWF0ZWx5IChlLmcuIGxvZyB0aGUgZXhjZXB0aW9uIGFuZCByZXR1cm4gZ3JhY2VmdWxseSkgc28KLSAqIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgY2FuIGNvbnRpbnVlIGV4ZWN1dGluZy4KLSAqLwotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiBUaGlzIGNvbW1hbmQgcXVldWUgaXMgc2hhcmVkIHdpdGggdGhlIGNvbW1hbmQgZXhlY3V0aW9uL2NvbnN1bWVyIHRocmVhZC4KLQkgKiBBZGRpbmcgYSBjb21tYW5kIHRvIGl0IHdpbGwgdHJpZ2dlciB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCBieSB0aGUKLQkgKiBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgb3IsIGlmIGFub3RoZXIgY29tbWFuZCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLAotCSAqIHRvIGV4ZWN1dGUgdGhlIG5ldyBjb21tYW5kIG9uY2UgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCBoYXMKLQkgKiBmaW5pc2hlZCBleGVjdXRpbmcuCi0JICovCi0JZmluYWwgU3luY2hyb25pemVkUXVldWU8Q29tbWFuZD4gY29tbWFuZHMgPSBuZXcgU3luY2hyb25pemVkUXVldWU8Q29tbWFuZD4oKTsKLQotCS8qKgotCSAqIE1vc3Qgb2YgdGhlIHRocmVhZC1yZWxhdGVkIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjb25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogQWxsb3cgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIEFzc2lnbiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvciA9IHRoaXMuYnVpbGRDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKHRocmVhZE5hbWUpOwotCX0KLQotCXByaXZhdGUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBidWlsZENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKHRoaXMuYnVpbGRDb25zdW1lcigpLCB0aHJlYWROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25zdW1lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCBzdGFydCB0aGUgY29tbWFuZCBleGVjdXRpb24vY29uc3VtZXIgdGhyZWFkLgotCSAqIDxwPgotCSAqIE5vdGU6IFdlIGRvbid0IGNsZWFyIHRoZSBjb21tYW5kIHF1ZXVlIGhlcmU7IHNvIGlmIGEgY29tbWFuZCBoYXMgYmVlbgotCSAqIGFkZGVkIHRvIHRoZSBxdWV1ZSA8ZW0+YmVmb3JlPC9lbT4gZ2V0dGluZyBoZXJlLCB0aGUgZmlyc3QgY29tbWFuZCB3aWxsCi0JICogYmUgZXhlY3V0ZWQgcHJvbXB0bHkgKGFsYmVpdCwgYXN5bmNocm9ub3VzbHkpLgotCSAqIFRoZSBjb21tYW5kIHF1ZXVlIHdpbGwgYmUgbm9uLWVtcHR5IGlmOjx1bD4KLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKENvbW1hbmQpfSB3YXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGV4ZWN1dG9yIHdhcwotCSAqICAgICBjb25zdHJ1Y3RlZCBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZDsgb3IKLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKENvbW1hbmQpfSB3YXMgY2FsbGVkIGFmdGVyIHtAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkCi0JICogICAgIGJ1dCBiZWZvcmUge0BsaW5rICNzdGFydCgpfSB3YXMgY2FsbGVkICh0byByZXN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dG9yKTsgb3IKLQkgKiA8bGk+e0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3ZXJlIHN0aWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzCi0JICogICAgIHJlbWFpbmluZyBpbiB0aGUgY29tbWFuZCBxdWV1ZQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgb24gdGhlIGNvbW1hbmQgcXVldWUsIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZQotCSAqIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmNvbW1hbmRzLmVucXVldWUoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJydXB0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBjdXJyZW50IGNvbW1hbmQuIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsCi0JICogdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgd2FzIGV4ZWN1dGluZywKLQkgKiB3cmFwIHRoZW0gaW4gYSBjb21wb3NpdGUgZXhjZXB0aW9uIGFuZCB0aHJvdyB0aGUgY29tcG9zaXRlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RvcCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyfQotCSAqIHdpbGwgZXhlY3V0ZSB0aGUgY29tbWFuZHMgZW5xdWV1ZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIEl0IHdpbGwgd2FpdCB1bnRpbCB0aGUgc2hhcmVkIGNvbW1hbmQgcXVldWUgaXMgbm9uLWVtcHR5IHRvIGJlZ2luIGV4ZWN1dGluZyB0aGUKLQkgKiBjb21tYW5kcyBpbiB0aGUgcXVldWUuIE9uY2UgYSBjb21hbmQgaXMgZXhlY3V0ZWQsIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlIHVudGlsCi0JICogYW5vdGhlciBjb21tYW5kIGlzIHBsYWNlZCBpbiB0aGUgY29tbWFuZCBxdWV1ZS4gSWYgYSBuZXcgY29tbWFuZCBpcwotCSAqIGVucXVldWVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGFub3RoZXIgY29tbWFuZCAoZWl0aGVyIHJlY3Vyc2l2ZWx5IGJ5Ci0JICogdGhlIGNvbW1hbmQgaXRzZWxmIG9yIGJ5IGFub3RoZXIgdGhyZWFkKSwKLQkgKiB0aGUgbmV3IGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudGx5Ci0JICogZXhlY3V0aW5nIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0JICogU3RvcCB0aGUgdGhyZWFkIGJ5IGNhbGxpbmcge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQoKX0uCi0JICovCi0JY2xhc3MgQ29uc3VtZXIKLQkJaW1wbGVtZW50cyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyCi0JewotCQlDb25zdW1lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogV2FpdCB1bnRpbCBhIGNvbW1hbmQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBxdWV1ZS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHdhaXRGb3JQcm9kdWNlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IudGhpcy5jb21tYW5kcy53YWl0VW50aWxOb3RFbXB0eSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgaW4gdGhlIHF1ZXVlIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IudGhpcy5jb21tYW5kcy5kZXF1ZXVlKCkuZXhlY3V0ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyNzQzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgY29sbGVjdGlvbiB0aGF0IGFsbG93cyBkdXBsaWNhdGUgZWxlbWVudHMuCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5CYWc8L2NvZGU+IGludGVyZmFjZSBwbGFjZXMgYWRkaXRpb25hbCBzdGlwdWxhdGlvbnMsCi0gKiBiZXlvbmQgdGhvc2UgaW5oZXJpdGVkIGZyb20gdGhlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0gaW50ZXJmYWNlLAotICogb24gdGhlIGNvbnRyYWN0cyBvZiB0aGUge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gYW5kIHtAbGluayAjaGFzaENvZGUoKX0gbWV0aG9kcy4KLSAqIAotICogQHNlZSBIYXNoQmFnCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBCYWc8RT4gZXh0ZW5kcyBqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPiB7Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgYmFnIGZvciBlcXVhbGl0eS4gUmV0dXJucwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGFsc28gYSBiYWcsIHRoZSB0d28gYmFncwotCSAqIGhhdmUgdGhlIHNhbWUgc2l6ZSwgYW5kIGV2ZXJ5IG1lbWJlciBvZiB0aGUgc3BlY2lmaWVkIGJhZyBpcwotCSAqIGNvbnRhaW5lZCBpbiB0aGlzIGJhZyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBvY2N1cnJlbmNlcyAob3IgZXF1aXZhbGVudGx5LAotCSAqIGV2ZXJ5IG1lbWJlciBvZiB0aGlzIGJhZyBpcyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBiYWcgd2l0aCB0aGUgc2FtZQotCSAqIG51bWJlciBvZiBvY2N1cnJlbmNlcykuIFRoaXMgZGVmaW5pdGlvbiBlbnN1cmVzIHRoYXQgdGhlCi0JICogZXF1YWxzIG1ldGhvZCB3b3JrcyBwcm9wZXJseSBhY3Jvc3MgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUKLQkgKiBiYWcgaW50ZXJmYWNlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBiYWcuIFRoZSBoYXNoIGNvZGUgb2YgYSBiYWcgaXMKLQkgKiBkZWZpbmVkIHRvIGJlIHRoZSBzdW0gb2YgdGhlIGhhc2ggY29kZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBiYWcsCi0JICogd2hlcmUgdGhlIGhhc2hjb2RlIG9mIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCBpcyBkZWZpbmVkIHRvIGJlIHplcm8uCi0JICogVGhpcyBlbnN1cmVzIHRoYXQgPGNvZGU+YjEuZXF1YWxzKGIyKTwvY29kZT4gaW1wbGllcyB0aGF0Ci0JICogPGNvZGU+YjEuaGFzaENvZGUoKSA9PSBiMi5oYXNoQ29kZSgpPC9jb2RlPiBmb3IgYW55IHR3byBiYWdzCi0JICogPGNvZGU+YjE8L2NvZGU+IGFuZCA8Y29kZT5iMjwvY29kZT4sIGFzIHJlcXVpcmVkIGJ5IHRoZSBnZW5lcmFsCi0JICogY29udHJhY3Qgb2YgdGhlIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0gbWV0aG9kLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgb2NjdXJzIGluIHRoZSBiYWcuCi0JICovCi0JaW50IGNvdW50KE9iamVjdCBvKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcyB0byB0aGUgYmFnLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBiYWcgY2hhbmdlZC4KLQkgKi8KLQlib29sZWFuIGFkZChFIG8sIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBmcm9tIHRoZSBiYWcuIFJldHVybiB3aGV0aGVyIHRoZSBiYWcgY2hhbmdlZC4KLQkgKi8KLQlib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLgotCSAqLwotCWphdmEudXRpbC5JdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pcXVlIGl0ZW1zIGluIHRoZSBiYWcuCi0JICovCi0JaW50IHVuaXF1ZUNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGFuIGVudHJ5IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGJhZwotCSAqIG9uY2UgYW5kIG9ubHkgb25jZSwgaXJyZXNwZWN0aXZlIG9mIGhvdyBtYW55IHRpbWVzCi0JICogdGhlIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSBiYWcuIFRoZSBlbnRyeSB3aWxsIGluZGljYXRlIHRoZSBpdGVtJ3MKLQkgKiBjb3VudC4KLQkgKi8KLQlqYXZhLnV0aWwuSXRlcmF0b3I8RW50cnk8RT4+IGVudHJpZXMoKTsKLQotCi0JLyoqCi0JICogQSBiYWcgZW50cnkgKGVsZW1lbnQtY291bnQgcGFpcikuCi0JICogVGhlIHtAbGluayBCYWcjZW50cmllcygpfSBtZXRob2QgcmV0dXJucyBhbiBpdGVyYXRvciB3aG9zZQotCSAqIGVsZW1lbnRzIGFyZSBvZiB0aGlzIGNsYXNzLiBUaGUgPGVtPm9ubHk8L2VtPiB3YXkgdG8gb2J0YWluIGEgcmVmZXJlbmNlCi0JICogdG8gYSBiYWcgZW50cnkgaXMgZnJvbSB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QuIFRoZXNlCi0JICogPGNvZGU+QmFnLkVudHJ5PC9jb2RlPiBvYmplY3RzIGFyZSB2YWxpZCA8ZW0+b25seTwvZW0+IGZvciB0aGUgZHVyYXRpb24KLQkgKiBvZiB0aGUgaXRlcmF0aW9uOyBtb3JlIGZvcm1hbGx5LCB0aGUgYmVoYXZpb3Igb2YgYSBiYWcgZW50cnkgaXMKLQkgKiB1bmRlZmluZWQgaWYgdGhlIGJhY2tpbmcgYmFnIGhhcyBiZWVuIG1vZGlmaWVkIGFmdGVyIHRoZSBlbnRyeSB3YXMKLQkgKiByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IsIGV4Y2VwdCB0aHJvdWdoIHRoZSB7QGxpbmsgI3NldENvdW50KGludCl9Ci0JICogb3BlcmF0aW9uIG9uIHRoZSBiYWcgZW50cnkuCi0JICovCi0JaW50ZXJmYWNlIEVudHJ5PEU+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzIGVsZW1lbnQuCi0JCSAqLwotCQlFIGdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIGVudHJ5J3MgY291bnQ7IGkuZS4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZW50cnkncyBlbGVtZW50Ci0JCSAqIG9jY3VycyBpbiB0aGUgYmFnLgotCQkgKiBAc2VlIEJhZyNjb3VudChPYmplY3QpCi0JCSAqLwotCQlpbnQgZ2V0Q291bnQoKTsKLQotCQkvKioKLQkJICogU2V0IHRoZSBlbnRyeSdzIGNvdW50OyBpLmUuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVudHJ5J3MgZWxlbWVudAotCQkgKiBvY2N1cnMgaW4gdGhlIGJhZy4gVGhlIG5ldyBjb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLgotCQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIGNvdW50IG9mIHRoZSBlbnRyeSdzIGVsZW1lbnQuCi0JCSAqIE5COiBVc2Uge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSB0byBzZXQgdGhlCi0JCSAqIGNvdW50IHRvIHplcm8uCi0JCSAqLwotCQlpbnQgc2V0Q291bnQoaW50IGNvdW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0OwotCQkgKiBpLmUuIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgPGNvZGU+QmFnLkVudHJ5PC9jb2RlPiBhbmQgaXRzCi0JCSAqIGVsZW1lbnQgYW5kIGNvdW50IGFyZSB0aGUgc2FtZSBhcyB0aGUgZW50cnkncy4KLQkJICovCi0JCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVudHJ5J3MgaGFzaCBjb2RlLgotCQkgKi8KLQkJaW50IGhhc2hDb2RlKCk7Ci0KLQl9Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+IGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+IGltcGxlbWVudHMgQmFnPEU+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCYWcgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IEJhZzxUPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnPD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEJhZzw/Pikgbykuc2l6ZSgpID09IDA7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZmJlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byBmaWx0ZXIgb2JqZWN0cwotICogaW4gYm90aCBkaXJlY3Rpb25zLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlGaWx0ZXI8VD4gZXh0ZW5kcyBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiAicmV2ZXJzZSIgZmlsdGVyLiBXaGF0IHRoYXQgbWVhbnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCWJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBub3RoaW5nIGlzIGZpbHRlcmVkIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBub3RoaW5nIGlzICJyZXZlcnNlLWZpbHRlcmVkIiAtIGV2ZXJ5dGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpRmlsdGVyLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIE9wYXF1ZTxTPiBpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgT3BhcXVlKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBPcGFxdWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBldmVyeXRoaW5nIGlzICJyZXZlcnNlLWZpbHRlcmVkIiAtIG5vdGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaUZpbHRlci5PcGFxdWUiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpRmlsdGVyLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDcyZWI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbnRvIHN0cmluZ3MgYW5kIHZpY2UgdmVyc2EuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVN0cmluZ0NvbnZlcnRlcjxUPiBleHRlbmRzIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYW4gb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImNvbnZlcnQgdG8gb2JqZWN0IiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKiBUeXBpY2FsbHksIGlmIHRoZSBzdHJpbmcgaXMgbnVsbCwgbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlUIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcyk7Ci0KLQotCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4gaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCdzICN0b1N0cmluZygpIHJlc3VsdAotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgc3RyaW5nCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUyBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAoUykgczsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFMgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgQm9vbGVhbkNvbnZlcnRlciBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4sIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiBJTlNUQU5DRSA9IG5ldyBCb29sZWFuQ29udmVydGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgQm9vbGVhbkNvbnZlcnRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLyoqIFJldHVybiAidHJ1ZSIgaWYgdGhlIEJvb2xlYW4gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiAiZmFsc2UiLiAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhCb29sZWFuIGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLyoqIFJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIHN0cmluZyBpcyAidHJ1ZSIgKGNhc2UtaW5zZW5zaXRpdmUpLCBvdGhlcndpc2UgcmV0dXJuIEJvb2xlYW4uRkFMU0UuICovCi0JCXB1YmxpYyBCb29sZWFuIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZihzKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBJbnRlZ2VyQ29udmVydGVyIGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+IElOU1RBTkNFID0gbmV3IEludGVnZXJDb252ZXJ0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBJbnRlZ2VyQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvKiogSW50ZWdlcidzICN0b1N0cmluZygpIHdvcmtzIHdlbGwuICovCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEludGVnZXIgaW50ZWdlcikgewotCQkJcmV0dXJuIChpbnRlZ2VyID09IG51bGwpID8gbnVsbCA6IGludGVnZXIudG9TdHJpbmcoKTsKLQkJfQotCQkvKiogQ29udmVydCB0aGUgc3RyaW5nIHRvIGFuIEludGVnZXIsIGlmIHBvc3NpYmxlLiAqLwotCQlwdWJsaWMgSW50ZWdlciBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZTM2NjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gZXh0ZW5kcyBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgInJldmVyc2UtdHJhbnNmb3JtZWQiIG9iamVjdC4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZXZlcnNlLXRyYW5zZm9ybSIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTMSwgUzI+IGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPFMxLCBTMj4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IEJpZGlUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzEgcmV2ZXJzZVRyYW5zZm9ybShTMiBvKSB7Ci0JCQlyZXR1cm4gKFMxKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpVHJhbnNmb3JtZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPiBpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gQmlkaVRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFMxIHJldmVyc2VUcmFuc2Zvcm0oUzIgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGYyMzEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQXNzb3J0ZWQgYml0IHRvb2xzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaXRUb29scyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZ0lzU2V0KGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZ0lzT2ZmKGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnSXNTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIG9ubHlGbGFnc0FyZVNldChmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ0lzT2ZmKGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBvbmx5RmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgPT0gZmxhZ3NUb0NoZWNrOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVjaykgJiYgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIH5mbGFnc1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVjaykgJiYgYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIH5mbGFnc1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSAhPSBmbGFnc1RvQ2hlY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlpbnQgY29tYmluZWRGbGFncyA9IG9yRmxhZ3MoZmxhZ3NUb0NoZWNrKTsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBjb21iaW5lZEZsYWdzKSAmJiBhbGxGbGFnc0FyZU9mZihmbGFncywgfmNvbWJpbmVkRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlpbnQgY29tYmluZWRGbGFncyA9IG9yRmxhZ3MoZmxhZ3NUb0NoZWNrKTsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBjb21iaW5lZEZsYWdzKSAmJiBhbGxGbGFnc0FyZVNldChmbGFncywgfmNvbWJpbmVkRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFueUZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhbnlGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPUiBhbGwgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIHRvZ2V0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvckZsYWdzKGludC4uLiBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0IHw9IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQU5EIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFuZEZsYWdzKGludC4uLiBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ICY9IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogWE9SIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHhvckZsYWdzKGludC4uLiBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0IF49IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCaXRUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZjU2Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGEgZmxhZyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSByZWNpcGllbnQuCi0gKiAKLSAqIEBzZWUgU3luY2hyb25pemVkQm9vbGVhbgotICovCi1wdWJsaWMgY2xhc3MgQm9vbGVhblJlZmVyZW5jZQotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5ib29sZWFuPC9jb2RlPi4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBCb29sZWFuUmVmZXJlbmNlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHJlZmVyZW5jZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIEJvb2xlYW5SZWZlcmVuY2UoKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXMoYm9vbGVhbiB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgbm90IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdChib29sZWFuIHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJ1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWxzZSgpIHsKLQkJcmV0dXJuICEgdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIHRoZSBOT1Qgb2YgaXRzIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmxpcCgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPSAhIHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXROb3QoYm9vbGVhbiB2KSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKCAhIHYpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRUcnVlKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldEZhbHNlKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBCb29sZWFuUmVmZXJlbmNlKSAmJgotCQkJKHRoaXMudmFsdWUgPT0gKChCb29sZWFuUmVmZXJlbmNlKSBvKS52YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPyAxIDogMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzJhN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQXNzb3J0ZWQgIkNhcGl0YWwtQiBCb29sZWFuIiBvcGVyYXRpb25zLgotICovCi0gLy8gY29tbWVudGVkIGNvZGUgaXMganVzdCBwbGF5aW5nIGFyb3VuZCB3aXRoIGJ1aWxkaW5nICpldmVyeXRoaW5nKiBmcm9tIE5BTkQKLXB1YmxpYyBmaW5hbCBjbGFzcyBCb29sZWFuVG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCBCb29sZWFuLgotCSAqIEJvb2xlYW4jbm90KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gbm90KEJvb2xlYW4gYikgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIGIuYm9vbGVhblZhbHVlKCkpOwotLy8JCXJldHVybiBuYW5kKGIsIGIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQU5EIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNhbmQoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gYW5kKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihiMS5ib29sZWFuVmFsdWUoKSAmJiBiMi5ib29sZWFuVmFsdWUoKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCXJldHVybiBuYW5kKG5hbmQsIG5hbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI29yKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihiMS5ib29sZWFuVmFsdWUoKSB8fCBiMi5ib29sZWFuVmFsdWUoKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCUJvb2xlYW4geG9yID0gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotLy8JCUJvb2xlYW4gYW5kID0gbmFuZChuYW5kLCBuYW5kKTsKLS8vCQlCb29sZWFuIG5hbmQyID0gbmFuZCh4b3IsIGFuZCk7Ci0vLwkJcmV0dXJuIG5hbmQobmFuZCh4b3IsIG5hbmQyKSwgbmFuZChhbmQsIG5hbmQyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBYT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI3hvcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB4b3IoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gYW5kKG9yKGIxLCBiMiksIG5hbmQoYjEsIGIyKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCXJldHVybiBuYW5kKG5hbmQoYjEsIG5hbmQpLCBuYW5kKGIyLCBuYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBOQU5EIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNuYW5kKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG5hbmQoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gbm90KGFuZChiMSwgYjIpKTsKLS8vCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIChiMS5ib29sZWFuVmFsdWUoKSAmJiBiMi5ib29sZWFuVmFsdWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTk9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNub3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gbm9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIG5vdChvcihiMSwgYjIpKTsKLS8vCQlCb29sZWFuIG5hbmQgPSBuYW5kKGIxLCBiMik7Ci0vLwkJQm9vbGVhbiB4b3IgPSBuYW5kKG5hbmQoYjEsIG5hbmQpLCBuYW5kKGIyLCBuYW5kKSk7Ci0vLwkJQm9vbGVhbiBhbmQgPSBuYW5kKG5hbmQsIG5hbmQpOwotLy8JCUJvb2xlYW4gbmFuZDIgPSBuYW5kKHhvciwgYW5kKTsKLS8vCQlCb29sZWFuIG5hbmQzID0gbmFuZChuYW5kKHhvciwgbmFuZDIpLCBuYW5kKGFuZCwgbmFuZDIpKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kMywgbmFuZDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgWE5PUiBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jeG5vcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB4bm9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIG5vdCh4b3IoYjEsIGIyKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCUJvb2xlYW4geG9yID0gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotLy8JCXJldHVybiBuYW5kKHhvciwgeG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEJvb2xlYW5Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2ZDIzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgamF2YS5sYW5nLnJlZmxlY3QgcGFja2FnZS4KLSAqIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSBzaG9ydGN1dHMgZm9yIG1hbmlwdWxhdGluZyBvYmplY3RzIHZpYQotICogcmVmbGVjdGlvbjsgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIGZpZWxkcyBhbmQvb3IgbWV0aG9kcyB0aGF0Ci0gKiBhcmUgbm90IHB1YmxpY2x5IGFjY2Vzc2libGUgb3IgYXJlIGluaGVyaXRlZC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgYWxsIHRoZSBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGFuZAotICogd3JhcHBlZCBpbiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbnM7IHNvIHRoZXNlIG1ldGhvZHMgc2hvdWxkCi0gKiBiZSB1c2VkIHdoZW4geW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3Ugd2lsbCBub3QgaGF2aW5nIGFueSBwcm9ibGVtcwotICogdXNpbmcgcmVmbGVjdGlvbi4KLSAqIAotICogVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgbWV0aG9kcyB3aG9zZSBuYW1lcwotICogYmVnaW4gd2l0aCAiYXR0ZW1wdCIuIFRoZXNlIG1ldGhvZHMgd2lsbCB0aHJvdyBhIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICogb3IgTm9TdWNoRmllbGRFeGNlcHRpb24gd2hlbiBhcHByb3ByaWF0ZSwgYWxsb3dpbmcgeW91IHRvIHByb2JlCi0gKiBmb3IgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGJ1dCBtaWdodCBub3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc1Rvb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBaRVJPX1BBUkFNRVRFUl9UWVBFUyA9IG5ldyBDbGFzc1swXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFpFUk9fUEFSQU1FVEVSUyA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SID0gJyQnOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEFSUkFZX0lORElDQVRPUiA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9PUEVOID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX0NMT1NFID0gJ10nOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19DT0RFID0gJ0wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIgPSAnOyc7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8UHJpbWl0aXZlPiBQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gdm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhbGxGaWVsZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGRbXSBhbGxGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPEZpZWxkPiBzdGFjayA9IG5ldyBTdGFjazxGaWVsZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlwdXNoRGVjbGFyZWRGaWVsZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBGaWVsZFtzdGFjay5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWxsTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBhbGxNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdGFjazxNZXRob2Q+IHN0YWNrID0gbmV3IFN0YWNrPE1ldGhvZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlwdXNoRGVjbGFyZWRNZXRob2RzKHRlbXBDbGFzcywgc3RhY2spOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2Uoc3RhY2spOwotCQlyZXR1cm4gc3RhY2sudG9BcnJheShuZXcgTWV0aG9kW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLm5ld0luc3RhbmNlKHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChvYmplY3QsIGZpZWxkTmFtZSkuZ2V0KG9iamVjdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZpZWxkKGphdmFDbGFzcywgZmllbGROYW1lKS5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIElmIHRoZSBleGVjdXRlZCBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUsIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiAKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihtZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2Qoc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIHNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLnNldChvYmplY3QsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZQotCSAqIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuc2V0KG51bGwsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGphdmFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKLQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkRmllbGRzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gZGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhY2Nlc3NpYmxlRGVjbGFyZWRNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjZGVmYXVsdENvbnN0cnVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBkZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIGZpZWxkKHN1cGVyY2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0KLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlyZXR1cm4gZmllbGQob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQkvLyB0aGlzIGNoZWNrIGFsbG93cyB1cyB0byB1c2UgdGhpcyBjb2RlIGZvciBjb25zdHJ1Y3RvcnMsIHdoZXJlIHRoZSBtZXRob2ROYW1lIGlzIG51bGwKLQkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCWludCBtYXggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ICE9IC0xKSB7Ci0JCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW21heF0uZ2V0TmFtZSgpKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlci5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3Qgc3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kICsgQ1IgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGl0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogQ29udmVydCBhbGwgb3RoZXIgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCVRocm93YWJsZSBjYXVzZSA9IGl0ZS5nZXRDYXVzZSgpOwotCQkJaWYgKGNhdXNlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QudG9TdHJpbmcoKSwgaXRlKTsKLQkJCX0KLQkJCXRocm93IGNhdXNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZCwgbnVsbCwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRob2QgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIG1ldGhvZChzdXBlcmNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzICh3aXRob3V0IHRoZSBjaGVja2VkIGV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlcik7Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb250byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1c2hEZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPEZpZWxkPiBzdGFjaykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGRlY2xhcmVkRmllbGRzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBmaWVsZHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXN0YWNrLnB1c2goZmllbGRzW2ldKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPE1ldGhvZD4gc3RhY2spIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGRlY2xhcmVkTWV0aG9kcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChtZXRob2RzW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqICJNZW1iZXIiIGNsYXNzZXMgd2lsbCByZXR1cm4gb25seSB0aGUgZmluYWwgbmFtZToKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogICAgICAgICA9PiAiTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogIkxvY2FsIiBhbmQgImFub255bW91cyIgY2xhc3NlcyB3aWxsIHN0aWxsIHJldHVybiB0aGUgZW1iZWRkZWQgJyQnczoKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMSIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDEiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNNZW1iZXIoY2xhc3NOYW1lKSA/Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSkKLQkJOgotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGxhc3RQZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3RQZXJpb2QgPT0gLTEpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzLAotCSAqIGZvbGxvd2VkIGJ5IGl0cyBwYWNrYWdlIG5hbWUgKGUuZy4gIk9iamVjdCAoamF2YS5sYW5nKSIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZVdpdGhQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVXaXRoUGFja2FnZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChzaG9ydE5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCWlmICggISBqYXZhQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJc2IuYXBwZW5kKCIgKCIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQocGFja2FnZU5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQsIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUgImRlY2xhcmVkIiBpbiBjb2RlOwotCSAqIGkuZS4gaXQgaXMgZWl0aGVyIGEgInRvcC1sZXZlbCIgY2xhc3Mgb3IgYSAibWVtYmVyIiBjbGFzcywgYnV0IGl0Ci0JICogaXMgbm90IGFuICJhcnJheSIgY2xhc3MuIFRoaXMgbWV0aG9kIHJvbGxzIHRvZ2V0aGVyIGFsbCB0aGUgY2hlY2tzCi0JICogZnJvbSB0aGUgb3RoZXIgbWV0aG9kcyBmb3IgYSBiaXQgb2YgYSBwZXJmb3JtYW5jZSB0d2Vhay4KLQkgKiBDbGFzcyNpc0RlY2xhcmFibGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNEZWNsYXJhYmxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkvLyBpdCBpcyBhbiAiYXJyYXkiIGNsYXNzCi0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgJyQnOiAiVG9wTGV2ZWxDbGFzcyIpLgotCSAqIENsYXNzI2lzVG9wTGV2ZWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNUb3BMZXZlbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgPT0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJtZW1iZXIiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBjb250YWlucyBhdCBsZWFzdCBvbmUgJyQnIGFuZCBhbGwgdGhlIG5hbWVzIGJldHdlZW4KLQkgKiBlYWNoICckJyBhcmUgbGVnYWwgY2xhc3MgbmFtZXM6Ci0JICogIlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc01lbWJlcigpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc01lbWJlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgImxvY2FsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIChvciBFY2xpcHNlKSBuYW1pbmcgY29udmVudGlvbnMuCi0JICogSW4gdGhlIGpkaywgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IHRoZQotCSAqIGxvY2FsIGNsYXNzIG5hbWU6ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIi4KLQkgKiBJbiBFY2xpcHNlLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm4kWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIHNlcGFyYXRlZCBmcm9tCi0JICogdGhlIGxvY2FsIGNsYXNzIG5hbWUgYnkgYW5vdGhlciAnJCc6ICJUb3BMZXZlbENsYXNzJDEkTG9jYWxDbGFzcyIuCi0JICogQ2xhc3MjaXNMb2NhbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0xvY2FsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGRvbGxhciArIDEpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBkb2xsYXIgKyAyOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cyAoYW5vbnltb3VzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoICckbm5uJyB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0ICckJyBhcmUgbnVtZXJpYyBkaWdpdHM6ICJUb3BMZXZlbENsYXNzJDEiKS4KLQkgKiBDbGFzcyNpc0Fub255bW91cygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0Fub255bW91cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBkb2xsYXIgKyAxOwotCQlmb3IgKGludCBpID0gY2xhc3NOYW1lLmxlbmd0aCgpOyBpLS0gPiBzdGFydDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJZGVwdGgrKzsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuCi0JICogTm9uLWFycmF5cyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCWRlcHRoKys7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQXJyYXkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogQSBub24tYXJyYXkgdHlwZSBzaW1wbHkgcmV0dXJucyBpdHNlbGYuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheS4KLQkgKiBBIG5vbi1hcnJheSBzaW1wbHkgcmV0dXJucyBpdHMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3IoamF2YUNsYXNzKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSk7Ci0JCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogImphdmEubGFuZy5PYmplY3QiIG9yICJpbnQiCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCWludCBsYXN0ID0gY2xhc3NOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGRlcHRoICsgMSwgbGFzdCk7CS8vIGRyb3AgdGhlIHRyYWlsaW5nICc7JwotCQl9Ci0JCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbSSIKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoY2xhc3NOYW1lLmNoYXJBdChsYXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAicmVmZXJlbmNlIgotCSAqIGNsYXNzIChpLmUuIG5laXRoZXIgJ3ZvaWQnIG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIFsnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAndm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmltaXRpdmUgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3JhcHBlckNsYXNzTmFtZShTdHJpbmcgcHJpbWl0aXZlQ2xhc3NOYW1lKSB7Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMocHJpbWl0aXZlQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiBwcmltaXRpdmUud3JhcHBlckNsYXNzLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHByaW1pdGl2ZTogIiArIHByaW1pdGl2ZUNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCi0JICogcHJpbWl0aXZlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzKENsYXNzPD8+IHByaW1pdGl2ZUNsYXNzKSB7Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzID09IHByaW1pdGl2ZUNsYXNzKSB7Ci0JCQkJcmV0dXJuIHByaW1pdGl2ZS53cmFwcGVyQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBwcmltaXRpdmU6ICIgKyBwcmltaXRpdmVDbGFzcy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gJ2phdmEubGFuZy5Wb2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsCi0JICogWydqYXZhLmxhbmcuQm9vbGVhbicsICdqYXZhLmxhbmcuSW50ZWdlcicsICdqYXZhLmxhbmcuRmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChwcmltaXRpdmUud3JhcHBlckNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSB8fCAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA+IE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoY2xhc3NDb2RlKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChwcmltaXRpdmUuY29kZSA9PSBjbGFzc0NvZGUpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLmphdmFDbGFzczsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGNsYXNzQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoKCAhIGphdmFDbGFzcy5pc0FycmF5KCkpICYmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpIDw9IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJCXJldHVybiBwcmltaXRpdmUuY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKCggISBjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSAmJiAoY2xhc3NOYW1lLmxlbmd0aCgpIDw9IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJCXJldHVybiBwcmltaXRpdmUuY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbGFzc05hbWUpOwkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24sIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXR5cGVEZWNsYXJhdGlvbiA9IFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKTsKLQkJaW50IGFycmF5RGVwdGggPSBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24pOwotCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24sIGFycmF5RGVwdGgpOwotCQlyZXR1cm4gbmV3IFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIGpkayBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MjZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBwcmltaXRpdmU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShzYi50b1N0cmluZygpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gIltJIgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAxCi0JICogICAgICJqYXZhLmxhbmcuU3RyaW5nW11bXVtdIiAtPiAzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogQXNzdW1lIG5vIHdoaXRlc3BhY2UgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAxOwotCQlpbnQgZGVwdGggPSAwOwotCQlpbnQgY2xvc2UgPSBsYXN0OwotCQl3aGlsZSAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSkgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UgLSAxKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4pIHsKLQkJCQlkZXB0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgZGVjbGFyYXRpb246ICIgKyB0eXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljbG9zZSA9IGxhc3QgLSAoZGVwdGggKiAyKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gImludCIKLQkgKiAgICAgImphdmEubGFuZy5TdHJpbmdbXVtdW10iIC0+ICJqYXZhLmxhbmcuU3RyaW5nIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXR5cGVEZWNsYXJhdGlvbiA9IFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uLCBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLgotCSAqICAgICAiaW50W10iIC0+ICJpbnQiCi0JICogICAgICJqYXZhLmxhbmcuU3RyaW5nW11bXVtdIiAtPiAiamF2YS5sYW5nLlN0cmluZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKgotCSAqIEFzc3VtZSBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gKGFycmF5RGVwdGggKiAyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50VHlwZU5hbWU7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCdcJycgKyBWT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0KLQkJLy8gbG9vayBmb3IgYSBwcmltaXRpdmUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gcHJpbWl0aXZlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltaXRpdmUgY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaW50IGxlbiA9IHByaW1pdGl2ZS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWludCBsZW4gPSBwcmltaXRpdmUud3JhcHBlckNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQkvKioKLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxQcmltaXRpdmU+IGJ1aWxkUHJpbWl0aXZlcygpIHsKLQkJUHJpbWl0aXZlW10gYXJyYXkgPSBuZXcgUHJpbWl0aXZlWzldOwotCQlhcnJheVswXSA9IG5ldyBQcmltaXRpdmUoQllURV9DT0RFLCBqYXZhLmxhbmcuQnl0ZS5jbGFzcyk7Ci0JCWFycmF5WzFdID0gbmV3IFByaW1pdGl2ZShDSEFSX0NPREUsIGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MpOwotCQlhcnJheVsyXSA9IG5ldyBQcmltaXRpdmUoRE9VQkxFX0NPREUsIGphdmEubGFuZy5Eb3VibGUuY2xhc3MpOwotCQlhcnJheVszXSA9IG5ldyBQcmltaXRpdmUoRkxPQVRfQ09ERSwgamF2YS5sYW5nLkZsb2F0LmNsYXNzKTsKLQkJYXJyYXlbNF0gPSBuZXcgUHJpbWl0aXZlKElOVF9DT0RFLCBqYXZhLmxhbmcuSW50ZWdlci5jbGFzcyk7Ci0JCWFycmF5WzVdID0gbmV3IFByaW1pdGl2ZShMT05HX0NPREUsIGphdmEubGFuZy5Mb25nLmNsYXNzKTsKLQkJYXJyYXlbNl0gPSBuZXcgUHJpbWl0aXZlKFNIT1JUX0NPREUsIGphdmEubGFuZy5TaG9ydC5jbGFzcyk7Ci0JCWFycmF5WzddID0gbmV3IFByaW1pdGl2ZShCT09MRUFOX0NPREUsIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKTsKLQkJYXJyYXlbOF0gPSBuZXcgUHJpbWl0aXZlKFZPSURfQ09ERSwgamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8UHJpbWl0aXZlPihhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBzdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIENsYXNzVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjZlMDBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogVE9ETwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoCi0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIGVudHJpZXMgaW4gdGhlIGNsYXNzcGF0aCAqLwotCXByaXZhdGUgZmluYWwgRW50cnlbXSBlbnRyaWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLy8gKioqKiogZmFjdG9yeSBtZXRob2RzIGZvciAic3RhbmRhcmQiIGNsYXNzcGF0aHMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAiYm9vdCIgY2xhc3NwYXRoLiBUaGlzIGluY2x1ZGVzIHJ0Lmphci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBib290Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInN1bi5ib290LmNsYXNzLnBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgInZpcnR1YWwgY2xhc3NwYXRoIiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgamFycwotCSAqIHRoYXQgd291bGQgYmUgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGphdmFFeHRlbnNpb25DbGFzc3BhdGgoKSB7Ci0JCUZpbGVbXSBkaXJzID0gamF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBqYXJGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChGaWxlIGRpciA6IGRpcnMpIHsKLQkJCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEphckZpbGVOYW1lc1RvKGRpciwgamFyRmlsZU5hbWVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChqYXJGaWxlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAic3lzdGVtIiBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggamF2YUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVucmV0b3VjaGVkICJjb21wbGV0ZSIgY2xhc3NwYXRoLgotCSAqIFRoaXMgaW5jbHVkZXMgdGhlIGJvb3QgY2xhc3NwYXRoLCB0aGUgSmF2YSBFeHRlbnNpb24KLQkgKiBNZWNoYW5pc20gY2xhc3NwYXRoLCBhbmQgdGhlIG5vcm1hbCAic3lzdGVtIiBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggY29tcGxldGVDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKG5ldyBDbGFzc3BhdGhbXSB7Ci0JCQkJYm9vdENsYXNzcGF0aCgpLAotCQkJCWphdmFFeHRlbnNpb25DbGFzc3BhdGgoKSwKLQkJCQlqYXZhQ2xhc3NwYXRoKCkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY2xhc3NwYXRoIHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggY2xhc3NwYXRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChsb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQl9Ci0KLQotCS8vICoqKioqIGZpbGUgPT4gY2xhc3MgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIG5hbWUgdG8gYSBjbGFzcyBuYW1lOyB0aGlzIHdpbGwgd29yayBmb3IKLQkgKiBhbnkgZmlsZSB0aGF0IGhhcyBhIHNpbmdsZSBleHRlbnNpb24gYmV5b25kIHRoZSBiYXNlCi0JICogY2xhc3MgbmFtZS4KLQkgKiBlLmcuICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEubGFuZy5TdHJpbmciCi0JICogZS5nLiAiamF2YS9sYW5nL1N0cmluZy5qYXZhIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEubGFuZy5TdHJpbmciCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oY2xhc3NGaWxlTmFtZSk7Ci0JCS8vIGRvIHRoaXMgZm9yIGFyY2hpdmUgZW50cnkgbmFtZXMKLQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkvLyBkbyB0aGlzIGZvciBPL1Mtc3BlY2lmaWMgZmlsZSBuYW1lcwotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGZpbGUgdG8gYSBjbGFzcyBuYW1lOwotCSAqIGUuZy4gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKSBpcyBjb252ZXJ0ZWQgdG8gImphdmEubGFuZy5TdHJpbmciCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKEZpbGUgY2xhc3NGaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc05hbWUoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgbmFtZSB0byBhIGNsYXNzOwotCSAqIGUuZy4gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiIGlzIGNvbnZlcnRlZCB0byBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjb252ZXJ0VG9DbGFzc05hbWUoY2xhc3NGaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIHRvIGEgY2xhc3M7Ci0JICogZS5nLiBGaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpIGlzIGNvbnZlcnRlZCB0byBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhGaWxlIGNsYXNzRmlsZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3MoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBKQVIgZW50cnkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhbiBhcmNoaXZlIGVudHJ5IG5hbWUgYmFzZTsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgY2xhc3MgZmlsZSBlbnRyeSBuYW1lOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYW4gYXJjaGl2ZSBjbGFzcyBmaWxlIGVudHJ5IG5hbWU7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBmaWxlICguY2xhc3Mgb3IgLmphdmEpICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGZpbGUgbmFtZSBiYXNlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmciIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBmaWxlIG5hbWUgYmFzZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmciIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZyIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBjbGFzcyBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZy5jbGFzcyIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBjbGFzcyBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmcuY2xhc3MiIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBjbGFzcyBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvIEZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGNsYXNzIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvIEZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmphdmEiIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZy5qYXZhIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUZpbGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShjbGFzc05hbWUpICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5qYXZhIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmcuamF2YSIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFGaWxlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFGaWxlTmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byBGaWxlKGphdmEvbGFuZy9TdHJpbmcuamF2YSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29udmVydFRvSmF2YUZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0phdmFGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUZpbGUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiByZXNvdXJjZSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgcmVzb3VyY2UgbmFtZTsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICIvamF2YS9sYW5nL1N0cmluZy5jbGFzcyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUmVzb3VyY2VOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gJy8nICsgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIHJlc291cmNlOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8KLQkgKiBVUkwoamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgY29udmVydFRvUmVzb3VyY2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqYXZhQ2xhc3MuZ2V0UmVzb3VyY2UoY29udmVydFRvUmVzb3VyY2VOYW1lKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKiogdXRpbGl0aWVzICoqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYW4gYXJjaGl2ZSBmaWxlOwotCSAqIGkuZS4gaXRzIG5hbWUgZW5kcyB3aXRoICIuemlwIiBvciAiLmphciIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0FyY2hpdmUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBleHQgPSBGaWxlVG9vbHMuZXh0ZW5zaW9uKGZpbGVOYW1lKS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gZXh0LmVxdWFscygiLmphciIpIHx8IGV4dC5lcXVhbHMoIi56aXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGU7Ci0JICogaS5lLiBpdHMgbmFtZSBlbmRzIHdpdGggIi56aXAiIG9yICIuamFyIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlSXNBcmNoaXZlKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZU5hbWVJc0FyY2hpdmUoZmlsZS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hhdCBzaG91bGQgYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBmaWxlIG5hbWUKLQkgKiBmb3IgdGhlIEpSRSBydW50aW1lIEpBUjsKLQkgKiBlLmcuICJDOlxqZGsxLjQuMl8wNFxqcmVcbGliXHJ0LmphciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnRKYXJOYW1lKCkgewotCQlyZXR1cm4gbG9jYXRpb25Gb3IoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gZnJvbSB3aGVyZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHdhcyBsb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25Gb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVVSTCB1cmwgPSBjb252ZXJ0VG9SZXNvdXJjZShqYXZhQ2xhc3MpOwotCQlTdHJpbmcgcGF0aDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGaWxlVG9vbHMuYnVpbGRGaWxlKHVybCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKS50b0xvd2VyQ2FzZSgpOwotCQlpZiAocHJvdG9jb2wuZXF1YWxzKCJqYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBKQVIsIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZignIScpKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBkaXJlY3RvcnksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgZmlsZTovQzovZGV2L21haW4vbXdkZXYvY2xhc3Mvb3JnL2VjbGlwc2UvZGFsaS91dGlsaXR5L0NsYXNzcGF0aC5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykubGVuZ3RoKCkgLSAxKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImJ1bmRsZXJlc291cmNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgYnVuZGxlIHJlc291cmNlIChFY2xpcHNlPyksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgYnVuZGxlcmVzb3VyY2U6Ly80My9vcmcvZWNsaXBzZS9kYWxpL3V0aWxpdHkvQ2xhc3NwYXRoLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzKS5sZW5ndGgoKSAtIDEpOwotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1cmwudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3JpZXMgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVzKGphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lcyB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZXh0LmRpcnMiKS5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKiBpbnRlcm5hbCAqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGNvbnZlcnRUb0ZpbGVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IGZpbGVOYW1lcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJZmlsZXNbaV0gPSBuZXcgRmlsZShmaWxlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphckZpbGVOYW1lc1RvKEZpbGUgZGlyLCBMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzKSB7Ci0JCUZpbGVbXSBqYXJGaWxlcyA9IGphckZpbGVzSW4oZGlyKTsKLQkJZm9yIChGaWxlIGphckZpbGUgOiBqYXJGaWxlcykgewotCQkJamFyRmlsZU5hbWVzLmFkZChGaWxlVG9vbHMuY2Fub25pY2FsRmlsZShqYXJGaWxlKS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGphckZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeS5saXN0RmlsZXMoamFyRmlsZUZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIGphckZpbGVGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXByaXZhdGUgQ2xhc3NwYXRoKEVudHJ5W10gZW50cmllcykgewotCQlzdXBlcigpOwotCQl0aGlzLmVudHJpZXMgPSBlbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQl0aGlzKGJ1aWxkRW50cmllcyhmaWxlTmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTa2lwIGVtcHR5IGZpbGUgbmFtZXMgYmVjYXVzZSB0aGV5IHdpbGwgZW5kIHVwIGV4cGFuZGluZyB0byB0aGUgY3VycmVudAotCSAqIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LiBFbXB0eSBmaWxlIG5hbWVzIGFjdHVhbGx5Ci0JICogb2NjdXIgd2l0aCBzb21lIGZyZXF1ZW5jeTsgc3VjaCBhcyB3aGVuIHRoZSBjbGFzc3BhdGggaGFzIGJlZW4gYnVpbHQgdXAKLQkgKiBkeW5hbWljYWxseSB3aXRoIHRvbyBtYW55IHNlcGFyYXRvcnMuIEZvciBleGFtcGxlOgotCSAqICAgICAiQzpcZGV2XGZvby5qYXI7O0M6XGRldlxiYXIuamFyIgotCSAqIHdpbGwgYmUgcGFyc2VkIGludG8gdGhyZWUgZmlsZSBuYW1lczoKLQkgKiAgICAgeyAiQzpcZGV2XGZvby5qYXIiLCAiIiwgIkM6XGRldlxiYXIuamFyIiB9Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRW50cnlbXSBidWlsZEVudHJpZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotCQkJaWYgKChmaWxlTmFtZSAhPSBudWxsKSAmJiAoZmlsZU5hbWUubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCQllbnRyaWVzLmFkZChuZXcgRW50cnkoZmlsZU5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMocGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHVibGljIENsYXNzcGF0aChMaXN0PFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXRoaXMoZmlsZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnNvbGlkYXRlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocyBpbnRvIGEgc2luZ2xlIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKENsYXNzcGF0aFtdIGNsYXNzcGF0aHMpIHsKLQkJdGhpcyhjb25zb2xpZGF0ZUVudHJpZXMoY2xhc3NwYXRocykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVudHJ5W10gY29uc29saWRhdGVFbnRyaWVzKENsYXNzcGF0aFtdIGNsYXNzcGF0aHMpIHsKLQkJTGlzdDxFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7Ci0JCWZvciAoQ2xhc3NwYXRoIGNsYXNzcGF0aCA6IGNsYXNzcGF0aHMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZW50cmllcywgY2xhc3NwYXRoLmVudHJpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXMudG9BcnJheShuZXcgRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzcGF0aCdzIGVudHJpZXMuCi0JICovCi0JcHVibGljIEVudHJ5W10gZW50cmllcygpIHsKLQkJcmV0dXJuIHRoaXMuZW50cmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzcGF0aCdzIHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBwYXRoKCkgewotCQlFbnRyeVtdIGxvY2FsRW50cmllcyA9IHRoaXMuZW50cmllczsKLQkJaW50IG1heCA9IGxvY2FsRW50cmllcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwMCk7Ci0JCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXNiLmFwcGVuZChsb2NhbEVudHJpZXNbaV0uZmlsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0JCX0KLQkJc2IuYXBwZW5kKGxvY2FsRW50cmllc1ttYXhdLmZpbGVOYW1lKCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHNwZWNpZmllZCAodW5xdWFsaWZpZWQpIGZpbGUKLQkgKiBhbmQgcmV0dXJuIGl0cyBlbnRyeS4gUmV0dXJuIG51bGwgaWYgYW4gZW50cnkgaXMgbm90IGZvdW5kLgotCSAqIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGZpbmQgdGhlIGVudHJ5Ci0JICogZm9yICJydC5qYXIiIG9yICJ0b3BsaW5rLmphciIuCi0JICovCi0JcHVibGljIEVudHJ5IGVudHJ5Rm9yRmlsZU5hbWVkKFN0cmluZyBzaG9ydEZpbGVOYW1lKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogbG9jYWxFbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuZmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoc2hvcnRGaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBmaWxlIGluIHRoZSBjbGFzc3BhdGgKLQkgKiB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogUmV0dXJuIG51bGwgaWYgYW4gZW50cnkgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBFbnRyeSBlbnRyeUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlTdHJpbmcgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lID0gY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpOwotCQlTdHJpbmcgYXJjaGl2ZUVudHJ5TmFtZSA9IGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoY2xhc3NOYW1lKTsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWZvciAoRW50cnkgZW50cnkgOiBsb2NhbEVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5jb250YWlucyhyZWxhdGl2ZUNsYXNzRmlsZU5hbWUsIGFyY2hpdmVFbnRyeU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aCwKLQkgKiB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciwgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGNsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigxMDAwMCk7Ci0JCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCXJldHVybiBjbGFzc05hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tjbGFzc05hbWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogbG9jYWxFbnRyaWVzKSB7Ci0JCQllbnRyeS5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkgKiBKdXN0IGEgYml0IG1vcmUgcGVyZm9ybWFudCB0aGFuICNjbGFzc05hbWVzKCkuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc1N0cmVhbSgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc1N0cmVhbShGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoRmlsdGVyKS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzU3RyZWFtKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5lbnRyeUNsYXNzTmFtZXNTdHJlYW1zKGZpbHRlcikpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gZW50cnlDbGFzc05hbWVzU3RyZWFtcyhmaW5hbCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVudHJ5LCBJdGVyYXRvcjxTdHJpbmc+PihuZXcgQXJyYXlJdGVyYXRvcjxFbnRyeT4odGhpcy5lbnRyaWVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oRW50cnkgZW50cnkpIHsKLQkJCQlyZXR1cm4gZW50cnkuY2xhc3NOYW1lc1N0cmVhbShmaWx0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhICJjb21wcmVzc2VkIiB2ZXJzaW9uIG9mIHRoZSBjbGFzc3BhdGggd2l0aCBpdHMKLQkgKiBkdXBsaWNhdGUgZW50cmllcyBlbGltaW5hdGVkLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY29tcHJlc3NlZCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyh0aGlzLmVudHJpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBjbGFzc3BhdGggdG8gYW4gYXJyYXkgb2YgVVJMcwotCSAqICh0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgVVJMQ2xhc3NMb2FkZXIpLgotCSAqLwotCXB1YmxpYyBVUkxbXSB1cmxzKCkgewotCQlFbnRyeVtdIGxvY2FsRW50cmllcyA9IHRoaXMuZW50cmllczsKLQkJaW50IGxlbiA9IGxvY2FsRW50cmllcy5sZW5ndGg7Ci0JCVVSTFtdIHVybHMgPSBuZXcgVVJMW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXVybHNbaV0gPSBsb2NhbEVudHJpZXNbaV0udXJsKCk7Ci0JCX0KLQkJcmV0dXJuIHVybHM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUT0RPCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgZmlsZTsKLQkJcHJpdmF0ZSBmaW5hbCBGaWxlIGNhbm9uaWNhbEZpbGU7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJRW50cnkoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKChmaWxlTmFtZSA9PSBudWxsKSB8fCAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCInZmlsZU5hbWUnIG11c3QgYmUgbm9uLWVtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJCXRoaXMuZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCXRoaXMuY2Fub25pY2FsRmlsZSA9IEZpbGVUb29scy5jYW5vbmljYWxGaWxlKHRoaXMuZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBmaWxlKCkgewotCQkJcmV0dXJuIHRoaXMuZmlsZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGNhbm9uaWNhbEZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBFbnRyeSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gKChFbnRyeSkgbykuY2Fub25pY2FsRmlsZS5lcXVhbHModGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZW50cnkncyAiY2Fub25pY2FsIiBVUkwuCi0JCSAqLwotCQlwdWJsaWMgVVJMIHVybCgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS50b1VSSSgpLnRvVVJMKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENsYXNzPD8+IGphdmFDbGFzcykgewotCQkJcmV0dXJuIHRoaXMuY29udGFpbnMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWlucyhjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSksIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoY2xhc3NOYW1lKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIGVpdGhlciB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlCi0JCSAqIGNsYXNzIGZpbGUgb3IgdGhlIHNwZWNpZmllZCBhcmNoaXZlIGVudHJ5LgotCQkgKiBOb3QgdGhlIHByZXR0aWVzdCBzaWduYXR1cmUsIGJ1dCBpdCdzIGludGVybmFsLi4uLgotCQkgKi8KLQkJYm9vbGVhbiBjb250YWlucyhTdHJpbmcgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lLCBTdHJpbmcgYXJjaGl2ZUVudHJ5TmFtZSkgewotCQkJaWYgKCAhIHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSAmJiAobmV3IEZpbGUodGhpcy5jYW5vbmljYWxGaWxlLCByZWxhdGl2ZUNsYXNzRmlsZU5hbWUpKS5leGlzdHMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkgJiYgdGhpcy5hcmNoaXZlQ29udGFpbnNFbnRyeShhcmNoaXZlRW50cnlOYW1lKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5J3MgYXJjaGl2ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVudHJ5LgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGFyY2hpdmVDb250YWluc0VudHJ5KFN0cmluZyB6aXBFbnRyeU5hbWUpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJCXppcEVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSh6aXBFbnRyeU5hbWUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGxlYXZlIHRoZSBlbnRyeSBudWxsCi0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmICh6aXBGaWxlICE9IG51bGwpIHsKLQkJCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXppcEVudHJ5ID0gbnVsbDsJLy8gc29tZXRoaW5nIGlzIHdyb25nLCBjbGVhciBvdXQgdGhlIGVudHJ5Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHppcEVudHJ5ICE9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXMoRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDIwMDApOwotCQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCXJldHVybiBjbGFzc05hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tjbGFzc05hbWVzLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJdGhpcy5hZGRDbGFzc05hbWVzRm9yRGlyZWN0b3J5VG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCQl9IGVsc2UgaWYgKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSkgewotCQkJCQl0aGlzLmFkZENsYXNzTmFtZXNGb3JBcmNoaXZlVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkgYW5kIGFjY2VwdGVkIGJ5Ci0JCSAqIHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWVzRm9yRGlyZWN0b3J5VG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaW50IHN0YXJ0ID0gdGhpcy5jYW5vbmljYWxGaWxlLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpICsgMTsKLQkJCWZvciAoSXRlcmF0b3I8RmlsZT4gc3RyZWFtID0gdGhpcy5jbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb252ZXJ0VG9DbGFzc05hbWUoc3RyZWFtLm5leHQoKS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGNsYXNzIGZpbGVzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5LgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxGaWxlPiBjbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlLCBGaWxlPihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy5jYW5vbmljYWxGaWxlKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQkJcmV0dXJuIEVudHJ5LnRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKG5leHQuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogaW4gdGhlIGVudHJ5J3MgYXJjaGl2ZSBmaWxlIGFuZCBhY2NlcHRlZCBieSB0aGUKLQkJICogc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lc0ZvckFyY2hpdmVUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJZm9yIChFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IHN0cmVhbSA9IHppcEZpbGUuZW50cmllcygpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHppcEVudHJ5TmFtZSA9IHppcEVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAodGhpcy5maWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUoemlwRW50cnlOYW1lKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHppcEVudHJ5TmFtZSk7Ci0JCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBtaWdodCBiZSBhIEphdmEgY2xhc3MgZmlsZS4KLQkJICogVGhlIGZpbGUgbmFtZSBtdXN0IGF0IGxlYXN0IGVuZCB3aXRoICIuY2xhc3MiIGFuZCBjb250YWluIG5vIHNwYWNlcy4KLQkJICogKE5laXRoZXIgY2xhc3MgbmFtZXMgbm9yIHBhY2thZ2UgbmFtZXMgbWF5IGNvbnRhaW4gc3BhY2VzLikKLQkJICogV2hldGhlciBpdCBhY3R1YWxseSBpcyBhIGNsYXNzIGZpbGUgd2lsbCBuZWVkIHRvIGJlIGRldGVybWluZWQgYnkKLQkJICogYSBjbGFzcyBsb2FkZXIuCi0JCSAqLwotCQlib29sZWFuIGZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIEZpbGVUb29scy5leHRlbnNpb24obmFtZSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5jbGFzcyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgKG5hbWUuaW5kZXhPZignICcpID09IC0xKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGguCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoKS4KLQkJICovCi0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNTdHJlYW0oKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzU3RyZWFtKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JCSAqIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKiBKdXN0IGEgYml0IG1vcmUgcGVyZm9ybWFudCB0aGFuICNjbGFzc05hbWVzKEZpbHRlcikuCi0JCSAqLwotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzU3RyZWFtKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzRm9yRGlyZWN0b3J5KGZpbHRlcik7Ci0JCQkJfQotCQkJCWlmIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc0ZvckFyY2hpdmUoZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5IGFuZCBhY2NlcHRlZCBieQotCQkgKiB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzRm9yRGlyZWN0b3J5KEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jbGFzc05hbWVzRm9yRGlyZWN0b3J5KCksIGZpbHRlcik7Ci0JCX0KLQotCQkvKioKLQkJICogVHJhbnNmb3JtIHRoZSBjbGFzcyBmaWxlcyB0byBjbGFzcyBuYW1lcy4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzRm9yRGlyZWN0b3J5KCkgewotCQkJZmluYWwgaW50IHN0YXJ0ID0gdGhpcy5jYW5vbmljYWxGaWxlLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpICsgMTsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBTdHJpbmc+KHRoaXMuY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRmlsZSBmKSB7Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9DbGFzc05hbWUoZi5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogaW4gdGhlIGVudHJ5J3MgYXJjaGl2ZSBmaWxlIGFuZCBhY2NlcHRlZCBieSB0aGUKLQkJICogc3BlY2lmaWVkIGZpbHRlci4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzRm9yQXJjaGl2ZShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCS8vIHdlIGNhbid0IHNpbXBseSB3cmFwIGl0ZXJhdG9ycyBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBjbG9zZSB0aGUgYXJjaGl2ZSBmaWxlLi4uCi0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPih6aXBGaWxlLnNpemUoKSk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gc3RyZWFtID0gemlwRmlsZS5lbnRyaWVzKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJWmlwRW50cnkgemlwRW50cnkgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgemlwRW50cnlOYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmICh0aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZSh6aXBFbnRyeU5hbWUpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb252ZXJ0VG9DbGFzc05hbWUoemlwRW50cnlOYW1lKTsKLQkJCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIGNsYXNzTmFtZXMuaXRlcmF0b3IoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMmNlZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbGxlY3Rpb25Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdlbmVyaWNJdGVyYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiB7QGxpbmsgQ29sbGVjdGlvbn0tcmVsYXRlZCB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uVG9vbHMgewotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oY29sbGVjdGlvbiwgaXRlcmF0b3IpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpdGVyYXRvciBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGxfKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLmFkZEFsbChsaXN0KGl0ZXJhdG9yLCBzaXplKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFLi4uIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gZmFsc2UgOiBhZGRBbGxfKGNvbGxlY3Rpb24sIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGFycmF5IGlzIG5vdCBlbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbF8oQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEUuLi4gYXJyYXkpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgZWxlbWVudCA6IGFycmF5KSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChsaXN0LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0LmFkZEFsbChpbmRleCwgbGlzdChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGxpc3QuYWRkQWxsKGluZGV4LCBBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJhZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoRW51bWVyYXRpb24gZW51bWVyYXRpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uLCBuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBpbnQgZW51bWVyYXRpb25TaXplKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24sIG5ldyBIYXNoQmFnPEU+KGVudW1lcmF0aW9uU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIEhhc2hCYWc8RT4gYmFnKSB7Ci0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJYmFnLmFkZChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBiYWcoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvciwgbmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yLCBuZXcgSGFzaEJhZzxFPihpdGVyYXRvclNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBIYXNoQmFnPEU+IGJhZykgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQliYWcuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJSGFzaEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPihsZW4pOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQliYWcuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIGludCBlbnVtZXJhdGlvblNpemUpIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbiwgZW51bWVyYXRpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGJhZyhhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+RW51bWVyYXRpb24uY29udGFpbnMoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoaXRlcmFibGUuaXRlcmF0b3IoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnMoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKGl0ZXJhdG9yLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdC4uLiBhcnJheSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgaW50IGl0ZXJhYmxlMVNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMVNpemUsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IpLmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSksIGl0ZXJhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IxKSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIGludCBpdGVyYXRvcjFTaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKHNldChpdGVyYXRvcjEsIGl0ZXJhdG9yMVNpemUpLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmRpZmZFbmQoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlmZkVuZChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZFbmQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscygpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5kaWZmUmFuZ2UoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICogQHNlZSAjZGlmZlN0YXJ0KExpc3QsIExpc3QpCi0JICogQHNlZSAjZGlmZkVuZChMaXN0LCBMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuZGlmZlJhbmdlKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoKX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuZGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZTdGFydChsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuaWRlbnRpdHlEaWZmRW5kKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZkVuZChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuaWRlbnRpdHlEaWZmU3RhcnQoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICogQHNlZSAjaWRlbnRpdHlEaWZmU3RhcnQoTGlzdCwgTGlzdCkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGxpc3QgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgbGlzdCwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGxpc3QKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBsaXN0KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgZXF1YWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgZG8gbm90IHJldHVybiB0aGUgc2FtZSBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVEaWZmZXJlbnQoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyBkbyBub3QgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzCi0JICogaW4gdGhlIHNhbWUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlRGlmZmVyZW50KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiAhIGVsZW1lbnRzQXJlRXF1YWwoaXRlcmF0b3IxLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIHJldHVybiBlcXVhbCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5lbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiBlcXVhbCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5lbGVtZW50c0FyZUVxdWFsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KGl0ZXJhdG9yMS5uZXh0KCksIGl0ZXJhdG9yMi5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiAhIChpdGVyYXRvcjEuaGFzTmV4dCgpIHx8IGl0ZXJhdG9yMi5oYXNOZXh0KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgaWRlbnRpY2FsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5pZGVudGljYWwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUlkZW50aWNhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVJZGVudGljYWwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuaWRlbnRpY2FsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVJZGVudGljYWwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgJiYgaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJaWYgKGl0ZXJhdG9yMS5uZXh0KCkgIT0gaXRlcmF0b3IyLm5leHQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gISAoaXRlcmF0b3IxLmhhc05leHQoKSB8fCBpdGVyYXRvcjIuaGFzTmV4dCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmdldChpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgZ2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmdldChpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgZ2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGluZGV4KSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRSBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGkrKyA9PSBpbmRleCkgewotCQkJCXJldHVybiBuZXh0OwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGluZGV4KSArICc6JyArIFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFzaCBjb2RlICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCWlmIChpdGVyYWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaGFzaCA9IDE7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBpdGVyYWJsZSkgewotCQkJaGFzaCA9IDMxICogaGFzaCArIChlbGVtZW50ID09IG51bGwgPyAwIDogZWxlbWVudC5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmluZGV4T2YoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gaW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmluZGV4T2YoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZXJhdG9yLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpdGVyYXRvci5oYXNOZXh0KCk7IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoaXRlcmF0b3IubmV4dCgpKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRpb24gaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBsaXN0IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGxpc3Qgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKExpc3Q8RT4gc29ydGVkTGlzdCwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpbnQgbGVuID0gc29ydGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh2YWx1ZS5jb21wYXJlVG8oc29ydGVkTGlzdC5nZXQoaSkpIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBsaXN0IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIEUgdmFsdWUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCWludCBsZW4gPSBzb3J0ZWRMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkTGlzdC5nZXQoaSkpIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhYmxlL2l0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaXRlcmFibGUoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEU+KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLml0ZXJhdG9yKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBpdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxFPihhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUubGFzdEluZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbGFzdEluZGV4T2YoaXRlcmFibGUuaXRlcmF0b3IoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUubGFzdEluZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbGFzdEluZGV4T2YoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IubGFzdEluZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdChpdGVyYXRvcikubGFzdEluZGV4T2YodmFsdWUpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLmxhc3RJbmRleE9mKHZhbHVlKSA6IC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBsaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gbGlzdChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBsaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gbGlzdChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbGlzdChpdGVyYXRvciwgbmV3IEFycmF5TGlzdDxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gbGlzdChpdGVyYXRvciwgbmV3IEFycmF5TGlzdDxFPihpdGVyYXRvclNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBBcnJheUxpc3Q8RT4gbGlzdCkgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFVubGlrZSB7QGxpbmsgQXJyYXlzI2FzTGlzdChPYmplY3RbXSl9LCB0aGUgbGlzdAotCSAqIGlzIG1vZGlmaWFibGUgYW5kIGlzIG5vdCBiYWNrZWQgYnkgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBsaXN0KEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8RT4oQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBsaXN0SXRlcmF0b3IoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8RT4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBsaXN0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QubW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBsaXN0IDogbW92ZV8obGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlXyhMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChsaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQkvLyBtb3ZlIGVsZW1lbnRzLCBsZWF2aW5nIHRoZSBsaXN0IGluIHBsYWNlCi0JCQlFIHRlbXAgPSBsaXN0LmdldChzb3VyY2VJbmRleCk7Ci0JCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaS0tID4gdGFyZ2V0SW5kZXg7ICkgewotCQkJCQlsaXN0LnNldChpICsgMSwgbGlzdC5nZXQoaSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpIDwgdGFyZ2V0SW5kZXg7IGkrKykgewotCQkJCQlsaXN0LnNldChpLCBsaXN0LmdldChpICsgMSkpOwotCQkJCX0KLQkJCX0KLQkJCWxpc3Quc2V0KHRhcmdldEluZGV4LCB0ZW1wKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHJlbW92ZSB0aGUgZWxlbWVudCBhbmQgcmUtYWRkIGl0IGF0IHRoZSB0YXJnZXQgaW5kZXgKLQkJCWxpc3QuYWRkKHRhcmdldEluZGV4LCBsaXN0LnJlbW92ZShzb3VyY2VJbmRleCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgbGlzdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0Lm1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbW92ZShMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCS8vIG1vdmUgZWxlbWVudHMsIGxlYXZpbmcgdGhlIGxpc3QgaW4gcGxhY2UKLQkJCUFycmF5TGlzdDxFPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxFPihsaXN0LnN1Ykxpc3Qoc291cmNlSW5kZXgsIHNvdXJjZUluZGV4ICsgbGVuZ3RoKSk7Ci0JCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaS0tID4gdGFyZ2V0SW5kZXg7ICkgewotCQkJCQlsaXN0LnNldChpICsgbGVuZ3RoLCBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkgKyBsZW5ndGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJbGlzdC5zZXQodGFyZ2V0SW5kZXggKyBpLCB0ZW1wLmdldChpKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyByZW1vdmUgdGhlIGVsZW1lbnRzIGFuZCByZS1hZGQgdGhlbSBhdCB0aGUgdGFyZ2V0IGluZGV4Ci0JCQlsaXN0LmFkZEFsbCh0YXJnZXRJbmRleCwgcmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIHNvdXJjZUluZGV4LCBsZW5ndGgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLnJlbW92ZUFsbChzZXQoaXRlcmF0b3IpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gY29sbGVjdGlvbi5yZW1vdmVBbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gZmFsc2UgOiBjb2xsZWN0aW9uLnJlbW92ZUFsbChzZXQoYXJyYXkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudAotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGxPY2N1cnJlbmNlcyhPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGxPY2N1cnJlbmNlcyhDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdCB2YWx1ZSkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPD8+IHN0cmVhbSA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHN0cmVhbS5uZXh0KCkgPT0gbnVsbCkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5yZW1vdmUoaW50IGluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KExpc3Q8RT4gbGlzdCwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Q8RT4gc3ViTGlzdCA9IGxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyBsZW5ndGgpOwotCQlBcnJheUxpc3Q8RT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFPihzdWJMaXN0KTsKLQkJc3ViTGlzdC5jbGVhcigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0LAotCSAqIHdoaWxlIG1haW50YWluaW5nIHRoZSBvcmRlci4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gcmVtb3ZlRHVwbGljYXRlRWxlbWVudHMoTGlzdDxFPiBsaXN0KSB7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWlmICgoc2l6ZSA9PSAwKSB8fCAoc2l6ZSA9PSAxKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0LCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgbGlzdCBpcyBub24tZW1wdHkKLQkgKi8KLQlzdGF0aWMgPEU+IGJvb2xlYW4gcmVtb3ZlRHVwbGljYXRlRWxlbWVudHMoTGlzdDxFPiBsaXN0LCBpbnQgc2l6ZSkgewotCQlMaW5rZWRIYXNoU2V0PEU+IHRlbXAgPSBuZXcgTGlua2VkSGFzaFNldDxFPihzaXplKTsJCS8vIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJZm9yIChFIGl0ZW0gOiBsaXN0KSB7Ci0JCQlpZiAoICEgdGVtcC5hZGQoaXRlbSkpIHsKLQkJCQltb2RpZmllZCA9IHRydWU7ICAvLyBkdXBsaWNhdGUgaXRlbQotCQkJfQotCQl9Ci0JCWlmIChtb2RpZmllZCkgewotCQkJaW50IGkgPSAwOwotCQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSB0ZW1wLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCWxpc3Quc2V0KGksIHN0cmVhbS5uZXh0KCkpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWludCB0ZW1wU2l6ZSA9IHRlbXAuc2l6ZSgpOwotCQkJZm9yIChpID0gbGlzdC5zaXplKCk7IGktLSA+IHRlbXBTaXplOyApIHsKLQkJCQlsaXN0LnJlbW92ZShpKTsgIC8vIHB1bGwgb2ZmIHRoZSBlbmQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJldGFpbkFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJldGFpbkFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGl0ZXJhdG9yKSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoYXJyYXkpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXZlcnNlTGlzdChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2VMaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gcmV2ZXJzZUxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnJldmVyc2VMaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHJldmVyc2UobGlzdChpdGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmV2ZXJzZShsaXN0KGl0ZXJhdG9yLCBzaXplKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJvdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiIGJ5IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LnJvdGF0ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCkgewotCQlyZXR1cm4gcm90YXRlKGxpc3QsIDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNldChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yLCBuZXcgSGFzaFNldDxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIG5ldyBIYXNoU2V0PEU+KGl0ZXJhdG9yU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEhhc2hTZXQ8RT4gc2V0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXNldC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoRS4uLiBhcnJheSkgewotCQlIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PEU+KGFycmF5Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlzZXQuYWRkKGFycmF5W2ldKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gaXRlcmF0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzaW5nbGUsCi0JICogc3BlY2lmaWVkIG9iamVjdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QudG9JdGVyYXRvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IHNpbmdsZXRvbkl0ZXJhdG9yKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNpbmdsZSwKLQkgKiBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC50b0xpc3RJdGVyYXRvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzaW5nbGV0b25MaXN0SXRlcmF0b3IoRSB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaXplICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc2l6ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNpemUoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zaXplKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2l6ZShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCXNpemUrKzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc29ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgc29ydGVkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc29ydCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmFibGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhYmxlLCBudWxsLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYWJsZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoQ29tcGFyYXRvciBjb21wYXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhYmxlLCBpdGVyYWJsZVNpemUpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0SXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhdG9yLCBudWxsLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc29ydChDb21wYXJhdG9yIGNvbXBhcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzb3J0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYXRvciksIGNvbXBhcmF0b3IpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBjb21wYXJhdG9yKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc29ydGVkIHNldCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlLCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYWJsZSBpdGVyYWJsZSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29tcGFyYXRvciwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgbnVsbCwgaXRlcmF0b3JTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmF0b3IgaXRlcmF0b3IsIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYXRvciBpdGVyYXRvciwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQobGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KExpc3Q8RT4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJVHJlZVNldDxFPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxFPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChsaXN0KTsKLQkJcmV0dXJuIHNvcnRlZFNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoYXJyYXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChPYmplY3RbXSBhcnJheSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCVRyZWVTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPbGQgU2Nob29sIFZlY3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmFibGUgaXRlcmFibGUsIGludCBzaXplKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhdG9yLCBuZXcgVmVjdG9yPEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmF0b3IgaXRlcmF0b3IsIGludCBzaXplKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYXRvciwgbmV3IFZlY3RvcjxFPihzaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBWZWN0b3I8RT4gdikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKE9iamVjdC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihFLi4uIGFycmF5KSB7Ci0JCVZlY3RvcjxFPiB2ID0gbmV3IFZlY3RvcjxFPihhcnJheS5sZW5ndGgpOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZS11c2UgSXRlcmFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgb25lLXVzZSB7QGxpbmsgSXRlcmFibGV9IGZvciB0aGUgc3BlY2lmaWVkIHtAbGluayBJdGVyYXRvcn0uCi0JICogVGhyb3cgYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYge0BsaW5rIEl0ZXJhYmxlI2l0ZXJhdG9yKCl9Ci0JICogaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS11c2Ugc2l0dWF0aW9ucywgc3VjaCBhcwotCSAqIGEgZm9yZWFjaCBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFNpbmdsZVVzZUl0ZXJhYmxlPEU+KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgb25lLXRpbWUgdXNlIGl0ZXJhYmxlIHRoYXQgY2FuIHJldHVybiBhIHNpbmdsZSBpdGVyYXRvci4KLQkgKiBPbmNlIHRoZSBpdGVyYXRvciBpcyByZXR1cm5lZCB0aGUgaXRlcmFibGUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS10aW1lIHVzZSBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgYSAnZm9yLWVhY2gnIGxvb3AuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVVc2VJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+IHsKLQkJcHJpdmF0ZSBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQotCQlwdWJsaWMgU2luZ2xlVXNlSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuaXRlcmF0b3IgPSBuZXcgR2VuZXJpY0l0ZXJhdG9yV3JhcHBlcjxFPihpdGVyYXRvcik7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlpZiAodGhpcy5pdGVyYXRvciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUl0ZXJhdG9yPEU+IHJlc3VsdCA9IHRoaXMuaXRlcmF0b3I7Ci0JCQl0aGlzLml0ZXJhdG9yID0gbnVsbDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogamF2YS51dGlsLkNvbGxlY3Rpb25zIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc3RpbmF0aW9uIGxpc3QgYWZ0ZXIgdGhlIHNvdXJjZSBsaXN0IGhhcyBiZWVuIGNvcGllZCBpbnRvIGl0LgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjY29weShMaXN0LCBMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gY29weShMaXN0PEU+IGRlc3QsIExpc3Q8PyBleHRlbmRzIEU+IHNyYykgewotCQlDb2xsZWN0aW9ucy5jb3B5KGRlc3QsIHNyYyk7Ci0JCXJldHVybiBkZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI2ZpbGwoTGlzdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gZmlsbChMaXN0PEU+IGxpc3QsIEUgdmFsdWUpIHsKLQkJQ29sbGVjdGlvbnMuZmlsbChsaXN0LCB2YWx1ZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicmV2ZXJzZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjcmV2ZXJzZShMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZShMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJyb3RhdGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3JvdGF0ZShMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByb3RhdGUoTGlzdDxFPiBsaXN0LCBpbnQgZGlzdGFuY2UpIHsKLQkJQ29sbGVjdGlvbnMucm90YXRlKGxpc3QsIGRpc3RhbmNlKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzaHVmZmxlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzaHVmZmxlKExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaHVmZmxlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5zaHVmZmxlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNodWZmbGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NodWZmbGUoTGlzdCwgUmFuZG9tKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc2h1ZmZsZShMaXN0PEU+IGxpc3QsIFJhbmRvbSByYW5kb20pIHsKLQkJQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0LCByYW5kb20pOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogTkI6IFRoZSBsaXN0IGlzIHNvcnRlZCBpbiBwbGFjZSBhcyBhIHNpZGUtZWZmZWN0LgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc29ydChMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IExpc3Q8RT4gc29ydChMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIE5COiBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gcGxhY2UgYXMgYSBzaWRlLWVmZmVjdC4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NvcnQoTGlzdCwgQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc3dhcChMaXN0LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHN3YXAoTGlzdDxFPiBsaXN0LCBpbnQgaSwgaW50IGopIHsKLQkJQ29sbGVjdGlvbnMuc3dhcChsaXN0LCBpLCBqKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJkNGUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21tYW5kUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFdyYXAgYSBDb21tYW5kIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgUnVubmFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCXB1YmxpYyBDb21tYW5kUnVubmFibGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVubmFibGVbIiArIHRoaXMuY29tbWFuZC50b1N0cmluZygpICsnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjYwM2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiA8Y29kZT5Db21wb3NpdGVDb21tYW5kPC9jb2RlPiBwcm92aWRlcyBzdXBwb3J0IGZvciB0cmVhdGluZyBhIGNvbGxlY3Rpb24gb2YKLSAqIHtAbGluayBDb21tYW5kfXMgYXMgYSBzaW5nbGUgY29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbW1hbmQKLQlpbXBsZW1lbnRzIENvbW1hbmQKLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPENvbW1hbmQ+IGNvbW1hbmRzOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbW1hbmQoSXRlcmFibGU8Q29tbWFuZD4gY29tbWFuZHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21tYW5kcyA9IGNvbW1hbmRzOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWZvciAoQ29tbWFuZCBjb21tYW5kIDogdGhpcy5jb21tYW5kcykgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbW1hbmRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVFeGNlcHRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxNjFlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFByb3ZpZGUgYSB3YXkgZm9yIG11bHRpcGxlIGV4Y2VwdGlvbnMgdG8gYmUgcGFja2FnZWQgYW5kIHJlcG9ydGVkLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlRXhjZXB0aW9uCi0JZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGVbXSBleGNlcHRpb25zOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb25zIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUV4Y2VwdGlvbihUaHJvd2FibGVbXSBleGNlcHRpb25zKSB7Ci0JCS8vIGdyYWIgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgbWFrZSBpdCB0aGUgImNhdXNlIgotCQlzdXBlcihleGNlcHRpb25zWzBdKTsKLQkJdGhpcy5leGNlcHRpb25zID0gZXhjZXB0aW9uczsKLQl9Ci0KLQlwdWJsaWMgVGhyb3dhYmxlW10gZ2V0RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZXhjZXB0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db25zdW1lclRocmVhZENvb3JkaW5hdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM5ZTcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db25zdW1lclRocmVhZENvb3JkaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yPC9jb2RlPiBjb250cm9scyB0aGUgY3JlYXRpb24sCi0gKiBzdGFydGluZywgYW5kIHN0b3BwaW5nIG9mIGEgZ2VuZXJhbCBwdXJwb3NlICJjb25zdW1lciIgdGhyZWFkLiBDb25zdHJ1Y3QKLSAqIHRoZSBjb29yZGluYXRvciB3aXRoIGEge0BsaW5rIENvbnN1bWVyfSB0aGF0IGJvdGggd2FpdHMgZm9yIHRoZSBwcm9kdWNlcgotICogdG8gInByb2R1Y2UiIHNvbWV0aGluZyB0byAiY29uc3VtZSIgYW5kLCBvbmNlIHRoZSB3YWl0IGlzIG92ZXIsCi0gKiAiY29uc3VtZXMiIHdoYXRldmVyIGlzIGF2YWlsYWJsZS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNsaWVudC1zdXBwbGllZCBjb25zdW1lciBzaG91bGQgaGFuZGxlIGFueQotICogZXhjZXB0aW9uIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5KSBzbwotICogdGhlIHRocmVhZCBjYW4gY29udGludWUgZXhlY3V0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciB7Ci0JLyoqCi0JICogVGhlIHJ1bm5hYmxlIHBhc3NlZCB0byB0aGUgY29uc3VtZXIgdGhyZWFkIGVhY2ggdGltZSBpdCBpcyBidWlsdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlOwotCi0JLyoqCi0JICogT3B0aW9uYWwsIGNsaWVudC1zdXBwbGllZCBuYW1lIGZvciB0aGUgY29uc3VtZXIgdGhyZWFkLgotCSAqIElmIG51bGwsIHRoZSBKREsgYXNzaWducyBhIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdW1lciBpcyBleGVjdXRlZCBvbiB0aGlzIHRocmVhZC4gQSBuZXcgdGhyZWFkIGlzIGJ1aWx0Ci0JICogZm9yIGV2ZXJ5IHN0YXJ0L3N0b3AgY3ljbGUgKHNpbmNlIGEgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkIG1vcmUgdGhhbgotCSAqIG9uY2UpLgotCSAqLwotCXByaXZhdGUgdm9sYXRpbGUgVGhyZWFkIHRocmVhZDsKLQotCS8qKgotCSAqIEEgbGlzdCBvZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyCi0JICogZHVyaW5nIHRoZSBjdXJyZW50IHN0YXJ0L3N0b3AgY3ljbGUuCi0JICovCi0JZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb25zdW1lciB0aHJlYWQgY29vcmRpbmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3VtZXIuCi0JICogQWxsb3cgdGhlIGNvbnN1bWVyIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyKSB7Ci0JCXRoaXMoY29uc3VtZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbnN1bWVyIHRocmVhZCBjb29yZGluYXRvciBmb3IgdGhlIHNwZWNpZmllZCBjb25zdW1lci4KLQkgKiBBc3NpZ24gdGhlIGNvbnN1bWVyIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoQ29uc3VtZXIgY29uc3VtZXIsIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucnVubmFibGUgPSB0aGlzLmJ1aWxkUnVubmFibGUoY29uc3VtZXIpOwotCQl0aGlzLnRocmVhZE5hbWUgPSB0aHJlYWROYW1lOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShDb25zdW1lciBjb25zdW1lcikgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlQ29uc3VtZXIoY29uc3VtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaWZlY3ljbGUgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgc3RhcnQgdGhlIGNvbnN1bWVyIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCgpOwotCQl0aGlzLnRocmVhZC5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkVGhyZWFkKCkgewotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQodGhpcy5ydW5uYWJsZSk7Ci0JCWlmICh0aGlzLnRocmVhZE5hbWUgIT0gbnVsbCkgewotCQkJdC5zZXROYW1lKHRoaXMudGhyZWFkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJydXB0IHRoZSBjb25zdW1lciB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIGl0cyBjdXJyZW50IGl0ZXJhdGlvbi4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgY29uc3VtZXIgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgY29uc3VtZXIgdGhyZWFkIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCWlmICh0aGlzLnRocmVhZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGhyZWFkLmludGVycnVwdCgpOwotCQl0cnkgewotCQkJdGhpcy50aHJlYWQuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhlIHRocmVhZCB0aGF0IGNhbGxlZCAjc3RvcCgpIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvCi0JCQkvLyBqb2luIHRoZSBjb25zdW1lciB0aHJlYWQgLSBpZ25vcmU7Ci0JCQkvLyAndGhyZWFkJyBpcyBzdGlsbCAiaW50ZXJydXB0ZWQiLCBzbyBpdHMgI3J1bigpIGxvb3Agd2lsbCBzdGlsbCBzdG9wCi0JCQkvLyBhZnRlciBpdHMgY3VycmVudCBleGVjdXRpb24gLSB3ZSBqdXN0IHdvbid0IHdhaXQgYXJvdW5kIGZvciBpdC4uLgotCQl9Ci0JCXRoaXMudGhyZWFkID0gbnVsbDsKLQotCQlpZiAodGhpcy5leGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCVRocm93YWJsZVtdIHRlbXAgPSB0aGlzLmV4Y2VwdGlvbnMudG9BcnJheShuZXcgVGhyb3dhYmxlW3RoaXMuZXhjZXB0aW9ucy5zaXplKCldKTsKLQkJCXRoaXMuZXhjZXB0aW9ucy5jbGVhcigpOwotCQkJdGhyb3cgbmV3IENvbXBvc2l0ZUV4Y2VwdGlvbih0ZW1wKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudGhyZWFkKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3VtZXIgdGhyZWFkIHJ1bm5hYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJ1bm5hYmxlfSBpcyBhIGxvbmctcnVubmluZyBjb25zdW1lciB0aGF0Ci0JICogd2lsbCByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGNvbnN1bWVyIHtAbGluayBDb25zdW1lciNleGVjdXRlKCl9IG1ldGhvZC4KLQkgKiBXaXRoIGVhY2ggaXRlcmF0aW9uLCB0aGUgY29uc3VtZXIgdGhyZWFkIHdpbGwgd2FpdAotCSAqIHVudGlsIHRoZSBvdGhlciBjb25zdW1lciBtZXRob2QsIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0sIGFsbG93cyB0aGUKLQkgKiBjb25zdW1lciB0aHJlYWQgdG8gcHJvY2VlZCAoaS5lLiB0aGVyZSBpcyBzb21ldGhpbmcgZm9yIHRoZSBjb25zdW1lciB0bwotCSAqIGNvbnN1bWUpLiBPbmNlIHtAbGluayBDb25zdW1lciNleGVjdXRlKCl9IGlzIGZpbmlzaGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZQotCSAqIHVudGlsIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0gcmV0dXJucyBhZ2Fpbi4KLQkgKiBTdG9wIHRoZSB0aHJlYWQgYnkgY2FsbGluZyB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCgpfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJ1bm5hYmxlQ29uc3VtZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqCi0JCSAqIENsaWVudC1zdXBwbGllZCBjb25zdW1lciB0aGF0IGNvbnRyb2xzIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBjb25zdW1lCi0JCSAqIGFuZCB0aGUgY29uc3VtaW5nIGl0c2VsZi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29uc3VtZXIgY29uc3VtZXI7Ci0KLQkJUnVubmFibGVDb25zdW1lcihDb25zdW1lciBjb25zdW1lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29uc3VtZXIgPSBjb25zdW1lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBMb29wIHdoaWxlIHRoaXMgdGhyZWFkIGhhcyBub3QgYmVlbiBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZC4KLQkJICogSW4gZWFjaCBsb29wOiBQYXVzZSBleGVjdXRpb24gdW50aWwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfQotCQkgKiBhbGxvd3MgdXMgdG8gcHJvY2VlZC4KLQkJICogPHA+Ci0JCSAqIElmIHRoaXMgdGhyZWFkIGlzIGludGVycnVwdGVkIDxlbT5kdXJpbmc8L2VtPiB7QGxpbmsgQ29uc3VtZXIjZXhlY3V0ZSgpfSwKLQkJICogdGhlIGNhbGwgdG8ge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHRlZCgpfSB3aWxsIHN0b3AgdGhlIGxvb3AuIElmIHRoaXMgdGhyZWFkIGlzCi0JCSAqIGludGVycnVwdGVkIGR1cmluZyB0aGUgY2FsbCB0byB7QGxpbmsgQ29uc3VtZXIjd2FpdEZvclByb2R1Y2VyKCl9LAotCQkgKiB3ZSB3aWxsIGNhdGNoIHRoZSB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGFuZCBzdG9wIHRoZSBsb29wIGFsc28uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl3aGlsZSAoICEgVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQl0aGlzLmNvbnN1bWVyLndhaXRGb3JQcm9kdWNlcigpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIHdlIHdlcmUgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZywgbXVzdCBiZSBRdWl0dGluJyBUaW1lCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGhpcy5leGVjdXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogRXhlY3V0ZSB0aGUgY29uc3VtZXIge0BsaW5rIENvbnN1bWVyI2V4ZWN1dGUoKX0gbWV0aG9kLgotCQkgKiBEbyBub3QgYWxsb3cgYW55IHVuaGFuZGxlZCBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHRocmVhZC4KLQkJICogU3RvcmUgdGhlbSB1cCBmb3IgbGF0ZXIgcGFpbi4KLQkJICogQHNlZSBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yI3N0b3AoKQotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMuZXhlY3V0ZV8oKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IudGhpcy5leGNlcHRpb25zLmFkZChleCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU3ViY2xhc3MtaW1wbGVtZW50ZWQgYmVoYXZpb3I6IGNvbnN1bWUgc3R1ZmYuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQl0aGlzLmNvbnN1bWVyLmV4ZWN1dGUoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN1bWVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyB0aGF0IGNvbnRyb2xzOjx1bD4KLQkgKiA8bGk+d2hlbiB0aGUgY29uc3VtZXIgdGhyZWFkIHN1c3BlbmRzLCB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gY29uc3VtZQotCSAqIDxsaT50aGUgY29uc3VtaW5nIG9mIHdoYXRldmVyIGlzIGJlaW5nIHByb2R1Y2VkCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIENvbnN1bWVyIHsKLQkJLyoqCi0JCSAqIFdhaXQgZm9yIHNvbWV0aGluZyB0byBjb25zdW1lLgotCQkgKiBUaHJvdyBhbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuCi0JCSAqLwotCQl2b2lkIHdhaXRGb3JQcm9kdWNlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCQkvKioKLQkJICogQ29uc3VtZSB3aGF0ZXZlciBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotCQkgKi8KLQkJdm9pZCBleGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiZGExMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGFsbG93aW5nIGNsaWVudHMgdG8gcGFzcyBhbiBleGNlcHRpb24gaGFuZGxlciB0byBhCi0gKiBzZXJ2aWNlIChlLmcuIHRvIGxvZyB0aGUgZXhjZXB0aW9uKS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaGVscGZ1bCBpZiB0aGUKLSAqIHNlcnZpY2UgZXhlY3V0ZXMgb24gYW5vdGhlciwgcG9zc2libHkgaW5hY2Nlc3NpYmxlLCB0aHJlYWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4Y2VwdGlvbkhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb24gd2FzIHRocm93bi4gSGFuZGxlIGl0IGFwcHJvcHJpYXRlbHkuCi0JICovCi0Jdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHQpOwotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdCBkb2VzCi0JICogbm90aGluZyB3aXRoIHRoZSBleGNlcHRpb24uCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIEV4Y2VwdGlvbkhhbmRsZXIsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjZXB0aW9uSGFuZGxlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgRXhjZXB0aW9uSGFuZGxlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkV4Y2VwdGlvbkhhbmRsZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdAotCSAqIHdyYXBzIHRoZSBleGNlcHRpb24gaW4gYSBydW50aW1lIGV4Y2VwdGlvbiBhbmQgdGhyb3dzIGl0LgotCSAqLwotCWZpbmFsIGNsYXNzIFJ1bnRpbWUgaW1wbGVtZW50cyBFeGNlcHRpb25IYW5kbGVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbkhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgUnVudGltZSgpOwotCQlwdWJsaWMgc3RhdGljIEV4Y2VwdGlvbkhhbmRsZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIFJ1bnRpbWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotCQkJLy8gcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiB1bmNoZWNrZWQKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJiMDMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEFzc29ydGVkIGZpbGUgdG9vbHM6Ci0gKiAtIGRlbGV0ZSBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGl0ZXJhdG9ycyBvbiBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotICogLSAiY2Fub25pemUiIGZpbGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUgPSAidG1wZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIEEgbGlzdCBvZiBzb21lIGludmFsaWQgZmlsZSBuYW1lIGNoYXJhY3RlcnMuCi0JCQkJOiBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIE1hY09TIGFuZCB0aGUgZHJpdmUgaW5kaWNhdG9yIGluIERPUwotCQkJCSogaXMgYSBET1Mgd2lsZGNhcmQgY2hhcmFjdGVyCi0JCQkJfCBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkmIGlzIG91ciBvd24gZXNjYXBlIGNoYXJhY3RlcgotCQkJCS8gaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBVbml4IGFuZCB0aGUgY29tbWFuZCBvcHRpb24gdGFnIGluIERPUwotCQkJCVwgaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBET1MvV2luZG93cyBhbmQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaW4gVW5peAotCQkJCTsgaXMgPz8/Ci0JCQkJPyBpcyBhIERPUyB3aWxkY2FyZCBjaGFyYWN0ZXIKLQkJCQlbIGlzID8/PwotCQkJCV0gaXMgPz8/Ci0JCQkJPSBpcyA/Pz8KLQkJCQkrIGlzID8/PwotCQkJCTwgaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJPiBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkiIGlzIHVzZWQgYnkgRE9TIHRvIGRlbGltaXQgZmlsZSBuYW1lcyB3aXRoIHNwYWNlcwotCQkJCSwgaXMgPz8/Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTID0geyAnOicsICcqJywgJ3wnLCAnJicsICcvJywgJ1xcJywgJzsnLCAnPycsICdbJywgJ10nLCAnPScsICcrJywgJzwnLCAnPicsICciJywgJywnIH07Ci0KLQkvKiogVGhpcyBlbmNvZGVyIHdpbGwgY29udmVydCBzdHJpbmdzIGludG8gdmFsaWQgZmlsZSBuYW1lcy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFN0cmluZ0VuY29kZXIgRklMRV9OQU1FX0VOQ09ERVIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JLyoqIFdpbmRvd3MgZmlsZXMgdGhhdCBhcmUgcmVkaXJlY3RlZCB0byBkZXZpY2VzIGV0Yy4gKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMgPSB7Ci0JCSJjb24iLAotCQkiYXV4IiwKLQkJImNvbTEiLCAiY29tMiIsICJjb20zIiwgImNvbTQiLCAiY29tNSIsICJjb202IiwgImNvbTciLCAiY29tOCIsICJjb205IiwKLQkJImxwdDEiLCAibHB0MiIsICJscHQzIiwgImxwdDQiLCAibHB0NSIsICJscHQ2IiwgImxwdDciLCAibHB0OCIsICJscHQ5IiwKLQkJInBybiIsCi0JCSJudWwiCi0JfTsKLQotCS8qKiBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBzaG9ydGVuZWQgZmlsZSBuYW1lLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEggPSA2MDsKLQotCi0JLy8gKioqKioqKioqKiBkZWxldGluZyBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUFsbCgpPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5KG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVBbGwoKT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcmVjdG9yeSk7Ci0JCWlmICggISBkaXJlY3RvcnkuZGVsZXRlKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCSAqIChidXQgbm90IHRoZSBkaXJlY3RvcnkgaXRzZWxmKS4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlRmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnlDb250ZW50cyhGaWxlIGRpcmVjdG9yeSkgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlKTsJLy8gcmVjdXJzZSB0aHJvdWdoIHN1YmRpcmVjdG9yaWVzCi0JCQl9IGVsc2UgewotCQkJCWlmICggISBmaWxlLmRlbGV0ZSgpKSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogY29weWluZyBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotCSAqIEZpbGUjY29weShGaWxlIGRlc3RpbmF0aW9uRmlsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25GaWxlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVDaGFubmVsIHNvdXJjZUNoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpLmdldENoYW5uZWwoKTsKLQkJRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb25GaWxlKS5nZXRDaGFubmVsKCk7Ci0JCXRyeSB7Ci0JCQlkZXN0aW5hdGlvbkNoYW5uZWwudHJhbnNmZXJGcm9tKHNvdXJjZUNoYW5uZWwsIDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gYSBmaWxlIGJ5Ci0JICogdGhlIHNhbWUgbmFtZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCSAqIEZpbGUjY29weVRvRGlyZWN0b3J5KEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlUb0RpcmVjdG9yeShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCQlpZiAoICEgZGVzdGluYXRpb25GaWxlLmV4aXN0cygpICYmICEgZGVzdGluYXRpb25GaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZU5ld0ZpbGUoKSBmYWlsZWQ6ICIgKyBkZXN0aW5hdGlvbkZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0aW5hdGlvbkZpbGUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogaXRlcmF0b3Jpbmcgb3ZlciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciBzdWJkaXJlY3Rvcmllcy4KLQkgKiBGaWxlI2ZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlLCBGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBzdWJkaXJlY3RvcmllcwotCSAqIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZGlyZWN0b3JpZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKGRpcmVjdG9yeS5saXN0RmlsZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZVtdIGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZSwgRmlsZT4obmV3IEFycmF5SXRlcmF0b3I8RmlsZT4oZmlsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHRoZSBzdWJkaXJlY3RvcmllcyB0aGVtc2VsdmVzLgotCSAqIEZpbGUjZmlsZXNSZWN1cnNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW5UcmVlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBmaWxlc0luVHJlZUFzU2V0KGRpcmVjdG9yeSkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8RmlsZT4gZmlsZXNJblRyZWVBc1NldChGaWxlIGRpcmVjdG9yeSkgewotCQlTZXQ8RmlsZT4gZmlsZXMgPSBuZXcgSGFzaFNldDxGaWxlPigxMDAwMCk7Ci0JCWFkZEZpbGVzSW5UcmVlVG8oZGlyZWN0b3J5LCBmaWxlcyk7Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZpbGVzSW5UcmVlVG8oRmlsZSBkaXJlY3RvcnksIENvbGxlY3Rpb248RmlsZT4gYWxsRmlsZXMpIHsKLQkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJYWxsRmlsZXMuYWRkKGZpbGUpOwotCQkJfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlhZGRGaWxlc0luVHJlZVRvKGZpbGUsIGFsbEZpbGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXNSZWN1cnNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luVHJlZShuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXNSZWN1cnNlKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxGaWxlPihkaXJlY3Rvcmllc0luKGZpbGVzKSwgZGlyZWN0b3JpZXNJblRyZWVzKGRpcmVjdG9yaWVzSW4oZmlsZXMpKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlcyhJdGVyYXRvcjxGaWxlPiBkaXJlY3RvcmllcykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgSXRlcmF0b3I8RmlsZT4+KGRpcmVjdG9yaWVzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEZpbGU+IHRyYW5zZm9ybShGaWxlIG5leHQpIHsKLQkJCQkJcmV0dXJuIEZpbGVUb29scy5kaXJlY3Rvcmllc0luVHJlZShuZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBzaG9ydCBmaWxlIG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSdzIG5hbWUKLQkgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIElmIHRoZSBmaWxlJ3MgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gc3RyaXBFeHRlbnNpb24oZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8gZXh0ZW5zaW9uLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqIEZpbGUjZXh0ZW5zaW9uKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSdzIG5hbWUgaGFzIG5vIGV4dGVuc2lvbiwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKiBGaWxlI2V4dGVuc2lvbigpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZXh0ZW5zaW9uKGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYXJ5IGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGNsZWFyZWQgb3V0LgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSwgbmFtZSk7Ci0JCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlta2RpcnMoZGlyKTsKLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZGlyKSB7Ci0JCWlmICggISBkaXIubWtkaXJzKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJta2RpcnMoKSBmYWlsZWQ6ICIgKyBkaXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYQotCSAqIG5hbWUgb2YgInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKCAhIGRpci5leGlzdHMoKSkgewotCQkJbWtkaXJzKGRpcik7Ci0JCX0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhIG5hbWUgb2YKLQkgKiAidG1wZGlyIi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZDsKLQkgKiBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHRlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSAqbmV3KiB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHByZWZpeC4gVGhlIHByZWZpeCB3aWxsIGJlIGFwcGVuZGVkIHdpdGggYSBudW1iZXIgdGhhdAotCSAqIGlzIGluY3JlbWVudGVkLCBzdGFydGluZyB3aXRoIDEsIHVudGlsIGEgbm9uLXByZS1leGlzdGluZyBkaXJlY3RvcnkKLQkgKiBpcyBmb3VuZCBhbmQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYQotCSAqIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhcyBpbmRpY2F0ZWQgYnkKLQkgKiB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIG5ld1RlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICggISBwcmVmaXguZW5kc1dpdGgoIi4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcmVmaXggPSBwcmVmaXggKyAnLic7Ci0JCX0KLQkJRmlsZSBkaXI7Ci0JCWludCBpID0gMDsKLQkJZG8gewotCQkJaSsrOwotCQkJZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBwcmVmaXggKyBpKTsKLQkJfSB3aGlsZSAoICEgZGlyLm1rZGlycygpKTsKLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhICpuZXcqIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhCi0JICogcHJlZml4IG9mICJ0bXBkaXIiLiBUaGlzIHByZWZpeCB3aWxsIGJlIGFwcGVuZGVkIHdpdGggYSBudW1iZXIgdGhhdAotCSAqIGlzIGluY3JlbWVudGVkLCBzdGFydGluZyB3aXRoIDEsIHVudGlsIGEgbm9uLXByZS1leGlzdGluZyBkaXJlY3RvcnkKLQkgKiBpcyBmb3VuZCBhbmQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYQotCSAqIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhcyBpbmRpY2F0ZWQgYnkKLQkgKiB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIG5ld1RlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ld1RlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLQkgKiBUaGUgcmVzb3VyY2UgbmFtZSBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCwgaS5lLiBpdCBjYW5ub3QgYmUgcmVsYXRpdmUKLQkgKiB0byB0aGUgcGFja2FnZSBuYW1lL2RpcmVjdG9yeS4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb3VyY2VGaWxlKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlpZiAoICEgcmVzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIEZpbGVUb29scy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IGphdmFDbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOwotCQlyZXR1cm4gYnVpbGRGaWxlKHVybCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRGaWxlKHVybC5nZXRGaWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkkgdXJpID0gbmV3IFVSSShmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqICJjYW5vbmljYWwiIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gYSAiY2Fub25pY2FsIiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJLy8gc2V0dGxlIGZvciB0aGUgYWJzb2x1dGUgZmlsZQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBjYW5vbmljYWxGaWxlcyhJdGVyYXRvcjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZpbGUgdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBjYW5vbmljYWxGaWxlKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKENvbGxlY3Rpb248RmlsZT4gZmlsZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVzKGZpbGVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGludG8gYSAiY2Fub25pY2FsIiBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oZmlsZU5hbWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbm9uaWNhbEZpbGVOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlTmFtZXMoZmlsZU5hbWVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0ludmFsaWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiAhIGZpbGVOYW1lSXNWYWxpZChmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNWYWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGZpbGVuYW1lQ2hhciA9IGZpbGVuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUywgZmlsZW5hbWVDaGFyKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVmFsaWRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUsIGNoYXIgcmVwbGFjZW1lbnRDaGFyKSB7Ci0JCWludCBsZW4gPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZmlsZW5hbWVDaGFyID0gZmlsZW5hbWUuY2hhckF0KGkpOwotCQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJc2IuYXBwZW5kKHJlcGxhY2VtZW50Q2hhcik7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChmaWxlbmFtZUNoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHBlcmlvZHMgKCcuJykgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1ZhbGlkRmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKGZpbGVuYW1lLCAnLicpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGlzICJyZXNlcnZlZCIKLQkgKiAoaS5lLiBpdCBjYW5ub3QgYmUgdXNlZCBmb3IgInVzZXIiIGZpbGVzKS4gV2luZG93cyByZXNlcnZlcwotCSAqIGEgbnVtYmVyIG9mIGZpbGUgbmFtZXMgKGUuZy4gQ09OLCBBVVgsIFBSTikuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNSZXNlcnZlZChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGV4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMsIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJLy8gVW5peCBkb2VzIG5vdCBoYXZlIGFueSAicmVzZXJ2ZWQiIGZpbGUgbmFtZXMgKEkgdGhpbmsuLi4pCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGNvbnRhaW5zIGFueSAicmVzZXJ2ZWQiCi0JICogY29tcG9uZW50cy4KLQkgKiBXaW5kb3dzIHJlc2VydmVzIGEgbnVtYmVyIG9mIGZpbGUgbmFtZXMgKGUuZy4gQ09OLCBBVVgsIFBSTik7Ci0JICogYW5kIHRoZXNlIGZpbGUgbmFtZXMgY2Fubm90IGJlIHVzZWQgZm9yIGVpdGhlciB0aGUgbmFtZXMgb2YKLQkgKiBmaWxlcyBvciBkaXJlY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhGaWxlIGZpbGUpIHsKLQkJRmlsZSB0ZW1wID0gZmlsZTsKLQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewotCQkJaWYgKGZpbGVOYW1lSXNSZXNlcnZlZCh0ZW1wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNob3J0ZW5lZCBmaWxlIG5hbWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKFVSTCB1cmwpIHsKLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZSh1cmwsIE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKFVSTCB1cmwsIGludCBtYXhMZW5ndGgpIHsKLQkJRmlsZSBmaWxlOwotCQl0cnkgewotCQkJZmlsZSA9IGJ1aWxkRmlsZSh1cmwpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUoZmlsZSwgbWF4TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZShmaWxlLCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShGaWxlIGZpbGUsIGludCBtYXhMZW5ndGgpIHsKLQkJU3RyaW5nIGFic29sdXRlRmlsZU5hbWUgPSBjYW5vbmljYWxGaWxlKGZpbGUpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoYWJzb2x1dGVGaWxlTmFtZS5sZW5ndGgoKSA8PSBtYXhMZW5ndGgpIHsKLQkJCS8vIG5vIG5lZWQgdG8gc2hvcnRlbgotCQkJcmV0dXJuIGFic29sdXRlRmlsZU5hbWU7Ci0JCX0KLQotCQkvLyBicmVhayBkb3duIHRoZSBwYXRoIGludG8gaXRzIGNvbXBvbmVudHMKLQkJU3RyaW5nIGZzID0gRmlsZS5zZXBhcmF0b3I7Ci0JCVN0cmluZ1tdIHBhdGhzID0gYWJzb2x1dGVGaWxlTmFtZS5zcGxpdCgnXFwnICsgZnMpOwotCi0JCWlmIChwYXRocy5sZW5ndGggPD0gMSkgewotCQkJLy8gZS5nLiAiQzpcIgotCQkJcmV0dXJuIHBhdGhzWzBdOwotCQl9Ci0KLQkJaWYgKHBhdGhzLmxlbmd0aCA9PSAyKSB7Ci0JCQkvLyBlLmcuICJDOlxNeVJlYWxseUxvbmdGaWxlTmFtZS5leHQiIG9yICJDOlxNeVJlYWxseUxvbmdEaXJlY3RvcnlOYW1lIgotCQkJLy8gcmV0dXJuIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUgc2luY2UgdGhpcyBpcyBhIG1pbmltdW0gcmVxdWlyZW1lbnQsCi0JCQkvLyByZWdhcmRsZXNzIG9mIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkCi0JCQlyZXR1cm4gYWJzb2x1dGVGaWxlTmFtZTsKLQkJfQotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQocGF0aHNbMF0pOwkJLy8gYWx3YXlzIGFkZCB0aGUgZmlyc3QgZGlyZWN0b3J5LCB3aGljaCBpcyB1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIKLQotCQkvLyBLZWVwIHRoZSBpbmRleCBvZiBpbnNlcnRpb24gaW50byB0aGUgc3RyaW5nIGJ1ZmZlcgotCQlpbnQgaW5zZXJ0SW5kZXggPSBzYi5sZW5ndGgoKTsKLQotCQlzYi5hcHBlbmQoZnMpOwotCQlzYi5hcHBlbmQocGF0aHNbcGF0aHMubGVuZ3RoIC0gMV0pOwkJLy8gYXBwZW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlIGxhc3QgZGlyZWN0b3J5Ci0KLQkJbWF4TGVuZ3RoIC09IDQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIC00IGZvciAiLy4uLiIKLQotCQlpbnQgY3VycmVudExlbmd0aCA9IHNiLmxlbmd0aCgpIC0gNDsgLy8gLTQgZm9yICIvLi4uIgotCQlpbnQgbGVmdEluZGV4ID0gMTsgICAgICAgICAgICAgICAgICAgLy8gIDEgdG8gc2tpcCB0aGUgcm9vdCBkaXJlY3RvcnkKLQkJaW50IHJpZ2h0SW5kZXggPSBwYXRocy5sZW5ndGggLSAyOyAgIC8vIC0xIGZvciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBsYXN0IGRpcmVjdG9yeQotCi0JCWJvb2xlYW4gY2FuQWRkRnJvbUxlZnQgPSB0cnVlOwotCQlib29sZWFuIGNhbkFkZEZyb21SaWdodCA9IHRydWU7Ci0KLQkJLy8gQWRkIGVhY2ggZGlyZWN0b3J5LCB0aGUgaW5zZXJ0aW9uIGlzIGdvaW5nIGluIGJvdGggZGlyZWN0aW9uOiBsZWZ0IGFuZAotCQkvLyByaWdodCwgb25jZSBhIHNpZGUgY2FuJ3QgYmUgYWRkZWQsIHRoZSBvdGhlciBzaWRlIGlzIHN0aWxsIGNvbnRpbnVpbmcKLQkJLy8gdW50aWwgYm90aCBjYW4ndCBhZGQgYW55bW9yZQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFjYW5BZGRGcm9tTGVmdCAmJiAhY2FuQWRkRnJvbVJpZ2h0KQotCQkJCWJyZWFrOwotCi0JCQlpZiAoY2FuQWRkRnJvbVJpZ2h0KSB7Ci0JCQkJU3RyaW5nIHJpZ2h0RGlyZWN0b3J5ID0gcGF0aHNbcmlnaHRJbmRleF07Ci0JCQkJaW50IHJpZ2h0TGVuZ3RoID0gcmlnaHREaXJlY3RvcnkubGVuZ3RoKCk7Ci0KLQkJCQkvLyBBZGQgdGhlIGRpcmVjdG9yeSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbG9vcAotCQkJCWlmIChjdXJyZW50TGVuZ3RoICsgcmlnaHRMZW5ndGggKyAxIDw9IG1heExlbmd0aCkgewotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsICAgICBmcyk7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsIHJpZ2h0RGlyZWN0b3J5KTsKLQotCQkJCQljdXJyZW50TGVuZ3RoICs9IHJpZ2h0TGVuZ3RoICsgMTsKLQkJCQkJcmlnaHRJbmRleC0tOwotCi0JCQkJCS8vIFRoZSByaWdodCBzaWRlIGlzIG5vdyBvdmVybGFwcGluZyB0aGUgbGVmdCBzaWRlLCB0aGF0IG1lYW5zCi0JCQkJCS8vIHdlIGNhbid0IGFkZCBmcm9tIHRoZSByaWdodCBzaWRlIGFueW1vcmUKLQkJCQkJaWYgKGxlZnRJbmRleCA+PSByaWdodEluZGV4KSB7Ci0JCQkJCQljYW5BZGRGcm9tUmlnaHQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhbkFkZEZyb21SaWdodCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNhbkFkZEZyb21MZWZ0KSB7Ci0JCQkJU3RyaW5nIGxlZnREaXJlY3RvcnkgPSBwYXRoc1tsZWZ0SW5kZXhdOwotCQkJCWludCBsZWZ0TGVuZ3RoID0gbGVmdERpcmVjdG9yeS5sZW5ndGgoKTsKLQotCQkJCS8vIEFkZCB0aGUgZGlyZWN0b3J5IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGxvb3AKLQkJCQlpZiAoY3VycmVudExlbmd0aCArIGxlZnRMZW5ndGggKyAxIDw9IG1heExlbmd0aCkgewotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsICAgICBmcyk7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsIGxlZnREaXJlY3RvcnkpOwotCi0JCQkJCWluc2VydEluZGV4ICs9IGxlZnRMZW5ndGggKyAxOwotCQkJCQljdXJyZW50TGVuZ3RoICs9IGxlZnRMZW5ndGggKyAxOwotCQkJCQlsZWZ0SW5kZXgrKzsKLQotCQkJCQkvLyBUaGUgbGVmdCBzaWRlIGlzIG5vdyBvdmVybGFwcGluZyB0aGUgcmlnaHQgc2lkZSwgdGhhdCBtZWFucwotCQkJCQkvLyB3ZSBjYW4ndCBhZGQgZnJvbSB0aGUgbGVmdCBzaWRlIGFueW1vcmUKLQkJCQkJaWYgKGxlZnRJbmRleCA+PSByaWdodEluZGV4KSB7Ci0JCQkJCQljYW5BZGRGcm9tTGVmdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FuQWRkRnJvbUxlZnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGVmdEluZGV4IDw9IHJpZ2h0SW5kZXgpIHsKLQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgZnMpOwotCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgIi4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3lzdGVtIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdXNlckhvbWVEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShVU0VSX0hPTUVfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShVU0VSX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhlY3V0aW5nT25XaW5kb3dzKCkgewotCQlyZXR1cm4gZXhlY3V0aW5nT24oIldpbmRvd3MiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGVjdXRpbmdPbkxpbnV4KCkgewotLy8JCXJldHVybiBleGVjdXRpbmdPbigiTGludXgiKTsKLS8vCX0KLS8vCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGVjdXRpbmdPbihTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgZmlsZXMgdGhhdCBmaXQgdGhlIGZpbHRlci4KLQkgKiBGaWxlI2ZpbGVzKEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbHRlcihJdGVyYXRvcjxGaWxlPiBmaWxlcywgZmluYWwgRmlsZUZpbHRlciBmaWxlRmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBmaWxlRmlsdGVyLmFjY2VwdChuZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWM6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoL2Zvby9iYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3M6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoQzpcZm9vXGJhclxiYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5OyB0aGUgZGlyZWN0b3J5Ci0JICogKnNob3VsZCogYmUgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IHJlbGF0aXZlCi0JCWlmICggISBmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQlGaWxlIGNGaWxlID0gY2Fub25pY2FsRmlsZShmaWxlKTsKLQkJRmlsZSBjRGlyID0gY2Fub25pY2FsRmlsZShkaXIpOwotCi0JCS8vIHRoZSB0d28gYXJlIHRoZSBzYW1lIGRpcmVjdG9yeQotCQlpZiAoY0ZpbGUuZXF1YWxzKGNEaXIpKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRmlsZVtdIGZpbGVQYXRoRmlsZXMgPSBwYXRoRmlsZXMoY0ZpbGUpOwotCQlGaWxlW10gZGlyUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNEaXIpOwotCi0JCS8vIFdpbmRvd3Mgb25seSAoPyk6IHRoZSByb290cyBhcmUgZGlmZmVyZW50IC0gZS5nLiBEOlwgdnMuIEM6XAotCQlpZiAoICEgZGlyUGF0aEZpbGVzWzBdLmVxdWFscyhmaWxlUGF0aEZpbGVzWzBdKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIHJvb3QgaXMgdGhlIHNhbWUsIG5vdyBmaW5kIGhvdyBtdWNoIGlzIGluIGNvbW1vbgotCQlpbnQgaSA9IDA7CQkvLyB0aGlzIHdpbGwgcG9pbnQgYXQgdGhlIGZpcnN0IG1pc2NvbXBhcmUKLQkJd2hpbGUgKChpIDwgZGlyUGF0aEZpbGVzLmxlbmd0aCkgJiYgKGkgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkpIHsKLQkJCWlmIChkaXJQYXRoRmlsZXNbaV0uZXF1YWxzKGZpbGVQYXRoRmlsZXNbaV0pKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyBzYXZlIG91ciBjdXJyZW50IHBvc2l0aW9uCi0JCWludCBmaXJzdE1pc21hdGNoID0gaTsKLQotCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGlzIEFCT1ZFIHRoZSBkaXJlY3Rvcnk6IC4uLy4uCi0JCWlmIChmaXJzdE1pc21hdGNoID09IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gcmVsYXRpdmVQYXJlbnRGaWxlKGRpclBhdGhGaWxlcy5sZW5ndGggLSBmaXJzdE1pc21hdGNoKTsKLQkJfQotCi0JCS8vIGJ1aWxkIGEgbmV3IGZpbGUgZnJvbSB0aGUgcGF0aCBiZXlvbmQgdGhlIG1hdGNoaW5nIHBvcnRpb25zCi0JCUZpbGUgZGlmZiA9IG5ldyBGaWxlKGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJd2hpbGUgKCsraSA8IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlkaWZmID0gbmV3IEZpbGUoZGlmZiwgZmlsZVBhdGhGaWxlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBCRUxPVyB0aGUgZGlyZWN0b3J5OiBzdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJaWYgKGZpcnN0TWlzbWF0Y2ggPT0gZGlyUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGRpZmY7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBtdXN0IGJlIGEgUEVFUiBvZiB0aGUgZGlyZWN0b3J5OiAuLi8uLi9zdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJcmV0dXJuIG5ldyBGaWxlKHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCksIGRpZmYuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKC9mb28vYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKEM6XGZvb1xiYXJcYmF6LmphdmEpCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSkgewotCQlyZXR1cm4gY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHNwZWNpZmllZAotCSAqIGZpbGUuIEZvciBleGFtcGxlOgotCSAqICAgICBDOi9mb28vYmFyL2Jhei50eHQgPT4KLQkgKiAgICAgeyBDOi8sIEM6L2ZvbywgQzovZm9vL2JhciwgQzovZm9vL2Jhci9iYXoudHh0IH0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlMaXN0PEZpbGU+IHBhdGggPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCWZvciAoRmlsZSBmID0gZmlsZTsgZiAhPSBudWxsOyBmID0gZi5nZXRQYXJlbnRGaWxlKCkpIHsKLQkJCXBhdGguYWRkKGYpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UocGF0aCk7Ci0JCXJldHVybiBwYXRoLnRvQXJyYXkobmV3IEZpbGVbcGF0aC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCAobm9uLXplcm8pIG51bWJlciBvZiByZWxhdGl2ZQotCSAqIGZpbGUgbmFtZXMsIGUuZy4geHh4KDMpID0+IC4uLy4uLy4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlpZiAobGVuIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgbGVuKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoIi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IGxlbiAtIDE7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LCAiLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgL2ZvbykKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTsgdGhlIGRpcmVjdG9yeQotCSAqICpzaG91bGQqIGJlIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgYWJzb2x1dGUsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlCi0JCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZGlyLCBmaWxlLmdldFBhdGgoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYyAoQ1dEID0gL2Zvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IC9mb28vYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3MgKENXRCA9IEM6XGZvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEZpbGVUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSGFzaEJhZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkZjhiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSGFzaEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZSwgYmFja2VkIGJ5IGEKLSAqIGhhc2ggdGFibGUuIEl0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gdGhlIGl0ZXJhdGlvbiBvcmRlciBvZgotICogdGhlIGJhZydzIGVsZW1lbnRzOyBpbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIG9yZGVyCi0gKiB3aWxsIHJlbWFpbiBjb25zdGFudCBvdmVyIHRpbWUuIFRoaXMgY2xhc3MgcGVybWl0cyB0aGUgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgb2ZmZXJzIGNvbnN0YW50IHRpbWUgcGVyZm9ybWFuY2UgZm9yIHRoZSBiYXNpYyBvcGVyYXRpb25zCi0gKiAoPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+cmVtb3ZlPC9jb2RlPiwgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuZAotICogPGNvZGU+c2l6ZTwvY29kZT4pLCBhc3N1bWluZyB0aGUgaGFzaCBmdW5jdGlvbiBkaXNwZXJzZXMgdGhlIGVsZW1lbnRzCi0gKiBwcm9wZXJseSBhbW9uZyB0aGUgYnVja2V0cy4gSXRlcmF0aW5nIG92ZXIgdGhpcyBiYWcgcmVxdWlyZXMgdGltZQotICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzdW0gb2YgdGhlIGJhZydzIHNpemUgKHRoZSBudW1iZXIgb2YgZWxlbWVudHMpIHBsdXMgdGhlCi0gKiAiY2FwYWNpdHkiIG9mIHRoZSBiYWNraW5nIGhhc2ggdGFibGUgKHRoZSBudW1iZXIgb2YgYnVja2V0cykuIFRodXMsIGl0IGlzCi0gKiBpbXBvcnRhbnQgbm90IHRvIHNldCB0aGUgaW5pdGlhbCBjYXBhY2l0eSB0b28gaGlnaCAob3IgdGhlIGxvYWQgZmFjdG9yIHRvbwotICogbG93KSBpZiBpdGVyYXRpb24gcGVyZm9ybWFuY2UgaXMgaW1wb3J0YW50LgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9zdHJvbmc+IElmIG11bHRpcGxlCi0gKiB0aHJlYWRzIGFjY2VzcyBhIGJhZyBjb25jdXJyZW50bHksIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMKLSAqIHRoZSBiYWcsIGl0IDxlbT5tdXN0PC9lbT4gYmUgc3luY2hyb25pemVkIGV4dGVybmFsbHkuIFRoaXMgaXMgdHlwaWNhbGx5Ci0gKiBhY2NvbXBsaXNoZWQgYnkgc3luY2hyb25pemluZyBvbiBzb21lIG9iamVjdCB0aGF0IG5hdHVyYWxseSBlbmNhcHN1bGF0ZXMKLSAqIHRoZSBiYWcuIElmIG5vIHN1Y2ggb2JqZWN0IGV4aXN0cywgdGhlIGJhZyBzaG91bGQgYmUgIndyYXBwZWQiIHVzaW5nIHRoZQotICogPGNvZGU+Q29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbjwvY29kZT4gbWV0aG9kLiBUaGlzIGlzCi0gKiBiZXN0IGRvbmUgYXQgY3JlYXRpb24gdGltZSwgdG8gcHJldmVudCBhY2NpZGVudGFsIHVuc3luY2hyb25pemVkIGFjY2VzcwotICogdG8gdGhlIGJhZzoKLSAqIDxwcmU+Ci0gKiBDb2xsZWN0aW9uIGMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKG5ldyBIYXNoQmFnKC4uLikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBjbGFzcydzIDxjb2RlPml0ZXJhdG9yPC9jb2RlPiBtZXRob2QgYXJlCi0gKiA8ZW0+ZmFpbC1mYXN0PC9lbT46IGlmIHRoZSBiYWcgaXMgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGlzCi0gKiBjcmVhdGVkLCBpbiBhbnkgd2F5IGV4Y2VwdCB0aHJvdWdoIHRoZSBpdGVyYXRvcidzIG93biA8Y29kZT5yZW1vdmU8L2NvZGU+Ci0gKiBtZXRob2QsIHRoZSBpdGVyYXRvciB0aHJvd3MgYSB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0uCi0gKiBUaHVzLCBpbiB0aGUgZmFjZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiwgdGhlIGl0ZXJhdG9yIGZhaWxzIHF1aWNrbHkKLSAqIGFuZCBjbGVhbmx5LCByYXRoZXIgdGhhbiByaXNraW5nIGFyYml0cmFyeSwgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgYXQKLSAqIGFuIHVuZGV0ZXJtaW5lZCB0aW1lIGluIHRoZSBmdXR1cmUuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGFuIGl0ZXJhdG9yIGNhbm5vdCBiZSBndWFyYW50ZWVkCi0gKiBhcyBpdCBpcywgZ2VuZXJhbGx5IHNwZWFraW5nLCBpbXBvc3NpYmxlIHRvIG1ha2UgYW55IGhhcmQgZ3VhcmFudGVlcyBpbiB0aGUKLSAqIHByZXNlbmNlIG9mIHVuc3luY2hyb25pemVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLiBGYWlsLWZhc3QgaXRlcmF0b3JzCi0gKiB0aHJvdyA8Y29kZT5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uPC9jb2RlPiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgotICogVGhlcmVmb3JlLCBpdCB3b3VsZCBiZSB3cm9uZyB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCBkZXBlbmRlZCBvbiB0aGlzCi0gKiBleGNlcHRpb24gZm9yIGl0cyBjb3JyZWN0bmVzczogPGVtPnRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgaXRlcmF0b3JzCi0gKiBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIGRldGVjdCBidWdzLjwvZW0+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgbWFpbnRhaW5lZCBieSB0aGUgYmFnCi0gKiAKLSAqIEBzZWUgQ29sbGVjdGlvbgotICogQHNlZSBCYWcKLSAqIEBzZWUgU3luY2hyb25pemVkQmFnCi0gKiBAc2VlCUNvbGxlY3Rpb25zI3N5bmNocm9uaXplZENvbGxlY3Rpb24oQ29sbGVjdGlvbikKLSAqLwotcHVibGljIGNsYXNzIEhhc2hCYWc8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgaGFzaCB0YWJsZS4gUmVzaXplZCBhcyBuZWNlc3NhcnkuIExlbmd0aCBNVVNUIEFsd2F5cyBiZSBhIHBvd2VyIG9mIHR3by4gKi8KLQl0cmFuc2llbnQgRW50cnk8RT5bXSB0YWJsZTsKLQotCS8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHNpemUgPSAwOwotCi0JLyoqIFRoZSBudW1iZXIgb2YgdW5pcXVlIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHVuaXF1ZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBoYXNoIHRhYmxlIGlzIHJlaGFzaGVkIHdoZW4gaXRzIHNpemUgZXhjZWVkcyB0aGlzIHRocmVzaG9sZC4gKFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgKGludCkoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKS4pCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBpbnQgdGhyZXNob2xkOwotCi0JLyoqCi0JICogVGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgaGFzaCB0YWJsZS4KLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgYmFnIGhhcyBiZWVuIHN0cnVjdHVyYWxseSBtb2RpZmllZC4KLQkgKiBTdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgYXJlIHRob3NlIHRoYXQgY2hhbmdlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotCSAqIHRoZSBiYWcgb3Igb3RoZXJ3aXNlIG1vZGlmeSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIChlLmcuIHJlaGFzaCkuCi0JICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIG1ha2UgaXRlcmF0b3JzIG9uIHRoaXMgYmFnIGZhaWwtZmFzdC4KLQkgKgotCSAqIEBzZWUgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkgKi8KLQl0cmFuc2llbnQgaW50IG1vZENvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgLSBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkCi0JICogYnkgZWl0aGVyIG9mIHRoZSBjb25zdHJ1Y3RvcnMgd2l0aCBhcmd1bWVudHMuCi0JICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3byA8PSAxPDwzMC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMzA7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgdXNlZCB3aGVuIG5vbmUgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTYsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZygpIHsKLQkJdGhpcyhERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5Ci0JICogYW5kIHRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgREVGQVVMVF9MT0FEX0ZBQ1RPUiwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGJhZyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBAcGFyYW0gbG9hZEZhY3RvciB0aGUgbG9hZCBmYWN0b3IKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVybyBvciBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbm9uLXBvc2l0aXZlCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgdHJ1ZSk7ICAvLyB0cnVlID0gdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvciwgYm9vbGVhbiB2YWxpZGF0ZVBhcm1zKSB7Ci0JCXN1cGVyKCk7Ci0JCWludCBjYXBhY2l0eSA9IGluaXRpYWxDYXBhY2l0eTsKLQkJaWYgKHZhbGlkYXRlUGFybXMpIHsKLQkJCWlmIChjYXBhY2l0eSA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEluaXRpYWwgQ2FwYWNpdHk6ICIgKyBjYXBhY2l0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjYXBhY2l0eSA+IE1BWElNVU1fQ0FQQUNJVFkpIHsKLQkJCQljYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFk7Ci0JCQl9Ci0JCQlpZiAobG9hZEZhY3RvciA8PSAwIHx8IEZsb2F0LmlzTmFOKGxvYWRGYWN0b3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBMb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCi0JCQkvLyBmaW5kIGEgcG93ZXIgb2YgMiA+PSAnaW5pdGlhbENhcGFjaXR5JwotCQkJY2FwYWNpdHkgPSAxOwotCQkJd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCQkJY2FwYWNpdHkgPDw9IDE7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGNhcGFjaXR5KTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgYmFnIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgYmFnJ3MgbG9hZCBmYWN0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgMC43NSwKLQkgKiBhbmQgaXRzIGluaXRpYWwgY2FwYWNpdHkgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGhvbGQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYyB0aGUgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgcGxhY2VkIGludG8gdGhpcyBiYWcuCi0JICovCi0JcHVibGljIEhhc2hCYWcoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKE1hdGgubWF4KChpbnQpIChjLnNpemUoKSAvIERFRkFVTFRfTE9BRF9GQUNUT1IpICsgMSwgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZKSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7Ci0JCXRoaXMuYWRkQWxsXyhjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIGludCBoYXNoKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyA9PSBudWxsKSA/IDAgOiB0aGlzLnJlaGFzaChvLmhhc2hDb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIFR3ZWFrIHRoZSBzcGVjaWZpZWQgaGFzaCwgdG8gZGVmZW5kIGFnYWluc3QgcG9vciBpbXBsZW1lbnRhdGlvbnMKLQkgKiBvZiA8Y29kZT4jaGFzaENvZGUoKTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBpbnQgcmVoYXNoKGludCBoKSB7Ci0JCWggXj0gKGggPj4+MjApIF4gKGggPj4+IDEyKTsKLQkJcmV0dXJuIGggXiAoaCA+Pj4gNykgXiAoaCA+Pj4gNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBoYXNoLgotCSAqLwotCXByaXZhdGUgaW50IGluZGV4KGludCBoYXNoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4KGhhc2gsIHRoaXMudGFibGUubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGhhc2gKLQkgKiB3aXRoaW4gYSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCWludCBpbmRleChpbnQgaGFzaCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gaGFzaCAmIChsZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZEFsbChDb2xsZWN0aW9uKX0gZm9yIGNvbnN0cnVjdGlvbiBhbmQgY2xvbmluZy4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbF8oSXRlcmFibGU8PyBleHRlbmRzIEU+IGMpIHsKLQkJZm9yIChFIGUgOiBjKSB7Ci0JCQl0aGlzLmFkZF8oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZChPYmplY3QpfSBmb3IgY29uc3RydWN0aW9uIGFuZCBjbG9uaW5nLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkXyhFIG8pIHsKLQkJdGhpcy5hZGRfKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkKE9iamVjdCwgaW50KX0gZm9yIGNvbnN0cnVjdGlvbiwgY2xvbmluZywgYW5kIHNlcmlhbGl6YXRpb24uCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRfKEUgbywgaW50IGNudCkgewotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChoYXNoKTsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJT2JqZWN0IGVvOwotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKCgoZW8gPSBlLm9iamVjdCkgPT0gbykgfHwgKChvICE9IG51bGwpICYmIG8uZXF1YWxzKGVvKSkpKSB7Ci0JCQkJZS5jb3VudCArPSBjbnQ7Ci0JCQkJdGhpcy5zaXplICs9IGNudDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGhpcy50YWJsZVtpbmRleF0pOwotCQl0aGlzLnRhYmxlW2luZGV4XSA9IGU7Ci0JCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIHRoZSBtYWludGFpbmVkIHNpemUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNvbXBhcmVzIHRoZSBtYWludGFpbmVkIHNpemUgdG8gemVyby4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5zaXplID09IDA7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoIGZvciB0aGUgb2JqZWN0J3MgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwcml2YXRlIEVudHJ5PEU+IGdldEVudHJ5KE9iamVjdCBvKSB7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW3RoaXMuaW5kZXgoaGFzaCldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCU9iamVjdCBlbzsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmICgoKGVvID0gZS5vYmplY3QpID09IG8pIHx8ICgobyAhPSBudWxsKSAmJiBvLmVxdWFscyhlbykpKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudHJ5KG8pICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlFbnRyeTxFPiBlID0gdGhpcy5nZXRFbnRyeShvKTsKLQkJcmV0dXJuIChlID09IG51bGwpID8gMCA6IGUuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmVoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWcgaW50byBhIG5ldyBoYXNoIHRhYmxlCi0JICogd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0JICogbnVtYmVyIG9mIGRpZmZlcmVudCBlbGVtZW50cyBpbiB0aGUgYmFnIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQlpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7Ci0KLQkJaW50IG5ld0NhcGFjaXR5ID0gb2xkQ2FwYWNpdHkgKiAyICsgMTsKLQkJRW50cnk8RT5bXSBuZXdUYWJsZSA9IHRoaXMuYnVpbGRUYWJsZShuZXdDYXBhY2l0eSk7Ci0KLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiB0aGlzLmxvYWRGYWN0b3IpOwotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0KLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkVGFibGVbaV07IG9sZCAhPSBudWxsOyApIHsKLQkJCQlFbnRyeTxFPiBlID0gb2xkOwotCQkJCW9sZCA9IG9sZC5uZXh0OwotCi0JCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChlLmhhc2gsIG5ld0NhcGFjaXR5KTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVudHJ5PEU+W10gYnVpbGRUYWJsZShpbnQgY2FwYWNpdHkpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeVtjYXBhY2l0eV07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0KLQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBiYWcsIHNpbXBseSBidW1wIGl0cyBjb3VudAotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhjZWVkIHRoZSB0aHJlc2hvbGQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQlpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7ICAvLyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgaW5kZXgKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSA8VD4gRW50cnk8RT4gYnVpbGRFbnRyeShpbnQgaGFzaCwgT2JqZWN0IG8sIGludCBjbnQsIEVudHJ5PFQ+IG5leHQpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeShoYXNoLCBvLCBjbnQsIG5leHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0KLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJY250ID0gKGNudCA8IGUuY291bnQpID8gY250IDogZS5jb3VudDsKLQkJCQllLmNvdW50IC09IGNudDsKLQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3QgZWxlbWVudChzKSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJdGhpcy50YWJsZVtpbmRleF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCX0KLQkJCQl0aGlzLnNpemUgLT0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsZWFycyBvdXQgYWxsIG9mIHRoZSBoYXNoIHRhYmxlIGJ1Y2tldHMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJdGhpcy5tb2RDb3VudCsrOwotCQlmb3IgKGludCBpID0gdGFiLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQl0YWJbaV0gPSBudWxsOwotCQl9Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JCXRoaXMudW5pcXVlQ291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWc6IHRoZSBlbGVtZW50cwotCSAqIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0JICoKLQkgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBIYXNoQmFnPEU+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlIYXNoQmFnPEU+IGNsb25lID0gKEhhc2hCYWc8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQljbG9uZS50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZSh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQljbG9uZS5zaXplID0gMDsKLQkJCWNsb25lLnVuaXF1ZUNvdW50ID0gMDsKLQkJCWNsb25lLm1vZENvdW50ID0gMDsKLQkJCWNsb25lLmFkZEFsbF8odGhpcyk7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEhhc2ggdGFibGUgY29sbGlzaW9uIGxpc3QgZW50cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnk8RT4gaW1wbGVtZW50cyBCYWcuRW50cnk8RT4gewotCQlmaW5hbCBpbnQgaGFzaDsKLQkJZmluYWwgRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIGludCBjb3VudCwgRW50cnk8RT4gbmV4dCkgewotCQkJdGhpcy5oYXNoID0gaGFzaDsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJdGhpcy5uZXh0ID0gbmV4dDsKLQkJfQotCi0JCS8vICoqKioqIEJhZy5FbnRyeSBpbXBsZW1lbnRhdGlvbgotCQlwdWJsaWMgRSBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0KLQkJcHVibGljIGludCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCA8PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IG9sZCA9IHRoaXMuY291bnQ7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQlyZXR1cm4gb2xkOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnLkVudHJ5PD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQmFnLkVudHJ5IGUgPSAoQmFnLkVudHJ5KSBvOwotCQkJaWYgKHRoaXMuY291bnQgIT0gZS5nZXRDb3VudCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IG8xID0gdGhpcy5vYmplY3Q7Ci0JCQlPYmplY3QgbzIgPSBlLmdldEVsZW1lbnQoKTsKLQkJCWlmIChvMSA9PSBvMikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG8xID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gbzEuZXF1YWxzKG8yKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJRSBvID0gdGhpcy5vYmplY3Q7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogKHRoaXMuY291bnQgKiBvLmhhc2hDb2RlKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3QgKyAiPT4iICsgdGhpcy5jb3VudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgSGFzaEl0ZXJhdG9yKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ291bnQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIGludCBuZXh0RW50cnlDb3VudCA9IDA7Ci0JCXByaXZhdGUgRW50cnk8RT4gbGFzdFJldHVybmVkRW50cnkgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbW9kQ291bnQgdmFsdWUgdGhhdCB0aGUgaXRlcmF0b3IgYmVsaWV2ZXMgdGhhdCB0aGUgYmFja2luZwotCQkgKiBiYWcgc2hvdWxkIGhhdmUuIElmIHRoaXMgZXhwZWN0YXRpb24gaXMgdmlvbGF0ZWQsIHRoZSBpdGVyYXRvcgotCQkgKiBoYXMgZGV0ZWN0ZWQgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLQkJICovCi0JCXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJSGFzaEl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IEhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IEhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnlDb3VudCsrOwotCQkJaWYgKHRoaXMubmV4dEVudHJ5Q291bnQgPT0gZS5jb3VudCkgewotCQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJCXRoaXMubmV4dEVudHJ5Q291bnQgPSAwOwotCQkJfQotCQkJcmV0dXJuIGUub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCWludCBzbG90ID0gSGFzaEJhZy50aGlzLmluZGV4KHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCwgSGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSBIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlIYXNoQmFnLnRoaXMubW9kQ291bnQrKzsKLQkJCQkJdGhpcy5leHBlY3RlZE1vZENvdW50Kys7Ci0JCQkJCWUuY291bnQtLTsKLQkJCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IG9uZSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJCUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJSGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzbGlkZSBiYWNrIHRoZSBjb3VudCB0byBhY2NvdW50IGZvciB0aGUganVzdC1yZW1vdmVkIGVsZW1lbnQKLQkJCQkJCXRoaXMubmV4dEVudHJ5Q291bnQtLTsKLQkJCQkJfQotCQkJCQlIYXNoQmFnLnRoaXMuc2l6ZS0tOwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8RT4+IHsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgRW50cnk8RT4gbGFzdFJldHVybmVkRW50cnkgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbW9kQ291bnQgdmFsdWUgdGhhdCB0aGUgaXRlcmF0b3IgYmVsaWV2ZXMgdGhhdCB0aGUgYmFja2luZwotCQkgKiBiYWcgc2hvdWxkIGhhdmUuIElmIHRoaXMgZXhwZWN0YXRpb24gaXMgdmlvbGF0ZWQsIHRoZSBpdGVyYXRvcgotCQkgKiBoYXMgZGV0ZWN0ZWQgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLQkJICovCi0JCXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJRW50cnlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFbnRyeTxFPiBuZXh0KCkgewotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCWludCBzbG90ID0gSGFzaEJhZy50aGlzLmluZGV4KHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCwgSGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSBIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlIYXNoQmFnLnRoaXMubW9kQ291bnQrKzsKLQkJCQkJdGhpcy5leHBlY3RlZE1vZENvdW50Kys7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQlIYXNoQmFnLnRoaXMuc2l6ZSAtPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5LmNvdW50OwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBFbnRyeUl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBuZXcgRW50cnlJdGVyYXRvcigpOwotCQkKLQkJVW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IubmV4dCgpLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuZW50cnlJdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnPD8+KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlCYWc8RT4gYiA9IChCYWc8RT4pIG87Ci0JCWlmIChiLnNpemUoKSAhPSB0aGlzLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChiLnVuaXF1ZUNvdW50KCkgIT0gdGhpcy51bmlxdWVDb3VudCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxCYWcuRW50cnk8RT4+IHN0cmVhbSA9IGIuZW50cmllcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUJhZy5FbnRyeTxFPiBlbnRyeSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0Q291bnQoKSAhPSB0aGlzLmNvdW50KGVudHJ5LmdldEVsZW1lbnQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEUgbyA6IHRoaXMpIHsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQloICs9IG8uaGFzaENvZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGJhZyB0byBhIHN0cmVhbSAoaS5lLiBzZXJpYWxpemUgaXQpLgotCSAqCi0JICogQHNlcmlhbERhdGEgRW1pdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgYWxsIG9mIHRoZSBiYWcncyBlbGVtZW50cyAoZWFjaCBhbiBPYmplY3QpIGFuZAotCSAqICAgICB0aGVpciBjb3VudHMgKGVhY2ggYW4gaW50KSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCB0aGUgdGhyZXNob2xkLCBsb2FkIGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIGJ1Y2tldHMKLQkJcy53cml0ZUludCh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJcy53cml0ZUludCh0aGlzLnVuaXF1ZUNvdW50KTsKLQotCQkvLyB3cml0ZSBvdXQgZWxlbWVudHMgYW5kIGNvdW50cyAoYWx0ZXJuYXRpbmcpCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID4gMCkgewotCQkJZm9yIChFbnRyeTxFPiBlbnRyeSA6IHRoaXMudGFibGUpIHsKLQkJCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlzLndyaXRlT2JqZWN0KGVudHJ5Lm9iamVjdCk7Ci0JCQkJCXMud3JpdGVJbnQoZW50cnkuY291bnQpOwotCQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZWNvbnN0aXR1dGUgdGhlIGJhZyBmcm9tIGEgc3RyZWFtIChpLmUuIGRlc2VyaWFsaXplIGl0KS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCXRoaXMuYWRkXyhlbGVtZW50LCBlbGVtZW50Q291bnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTY1YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0lkZW50aXR5SGFzaEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZSB3aXRoIGEKLSAqIGhhc2ggdGFibGUsIHVzaW5nIG9iamVjdC1pZGVudGl0eSBpbiBwbGFjZSBvZiBvYmplY3QtZXF1YWxpdHkgd2hlbgotICogY29tcGFyaW5nIGVsZW1lbnRzLiBJbiBvdGhlciB3b3JkcywgaW4gYW4gPGNvZGU+SWRlbnRpdHlIYXNoQmFnPC9jb2RlPiwKLSAqIHR3byBvYmplY3RzIDxjb2RlPm8xPC9jb2RlPiBhbmQgPGNvZGU+bzI8L2NvZGU+IGFyZSBjb25zaWRlcmVkCi0gKiBlcXVhbCBpZiBhbmQgb25seSBpZiA8Y29kZT4obzEgPT0gbzIpPC9jb2RlPi4gKEluIG5vcm1hbCB7QGxpbmsgQmFnfQotICogaW1wbGVtZW50YXRpb25zIChsaWtlIHtAbGluayBIYXNoQmFnfSkgdHdvIG9iamVjdHMgPGNvZGU+bzE8L2NvZGU+Ci0gKiBhbmQgPGNvZGU+bzI8L2NvZGU+IGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIGFuZCBvbmx5IGlmCi0gKiA8Y29kZT4obzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpKTwvY29kZT4uKQotICogPHA+Ci0gKiA8c3Ryb25nPgotICogVGhpcyBjbGFzcyBpcyA8ZW0+bm90PC9lbT4gYSBnZW5lcmFsLXB1cnBvc2Uge0BsaW5rIEJhZ30KLSAqIGltcGxlbWVudGF0aW9uISBXaGlsZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZSwgaXQKLSAqIGludGVudGlvbmFsbHkgdmlvbGF0ZXMge0BsaW5rIEJhZ30ncyBnZW5lcmFsIGNvbnRyYWN0LCB3aGljaCBtYW5kYXRlcyB0aGUKLSAqIHVzZSBvZiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2Qgd2hlbiBjb21wYXJpbmcgb2JqZWN0cy4gVGhpcyBjbGFzcyBpcwotICogZGVzaWduZWQgZm9yIHVzZSBvbmx5IGluIHRoZSByYXJlIGNhc2VzIHdoZXJlaW4gb2JqZWN0LWlkZW50aXR5Ci0gKiBzZW1hbnRpY3MgYXJlIHJlcXVpcmVkLgotICogPC9zdHJvbmc+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWFrZXMgbm8gZ3VhcmFudGVlcyBhcyB0byB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mCi0gKiB0aGUgYmFnJ3MgZWxlbWVudHM7IGluIHBhcnRpY3VsYXIsIGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBvcmRlcgotICogd2lsbCByZW1haW4gY29uc3RhbnQgb3ZlciB0aW1lLiBUaGlzIGNsYXNzIHBlcm1pdHMgdGhlIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG9mZmVycyBjb25zdGFudCB0aW1lIHBlcmZvcm1hbmNlIGZvciB0aGUgYmFzaWMgb3BlcmF0aW9ucwotICogKDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPnJlbW92ZTwvY29kZT4sIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBhbmQKLSAqIDxjb2RlPnNpemU8L2NvZGU+KSwgYXNzdW1pbmcgdGhlIHN5c3RlbSBpZGVudGl0eSBoYXNoIGZ1bmN0aW9uCi0gKiAoe0BsaW5rIFN5c3RlbSNpZGVudGl0eUhhc2hDb2RlKE9iamVjdCl9KSBkaXNwZXJzZXMgZWxlbWVudHMgcHJvcGVybHkKLSAqIGFtb25nIHRoZSBidWNrZXRzLiBJdGVyYXRpbmcgb3ZlciB0aGlzIGJhZyByZXF1aXJlcyB0aW1lCi0gKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHN1bSBvZiB0aGUgYmFnJ3Mgc2l6ZSAodGhlIG51bWJlciBvZiBlbGVtZW50cykgcGx1cyB0aGUKLSAqICJjYXBhY2l0eSIgb2YgdGhlIGJhY2tpbmcgaGFzaCB0YWJsZSAodGhlIG51bWJlciBvZiBidWNrZXRzKS4gVGh1cywgaXQgaXMKLSAqIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBpbml0aWFsIGNhcGFjaXR5IHRvbyBoaWdoIChvciB0aGUgbG9hZCBmYWN0b3IgdG9vCi0gKiBsb3cpIGlmIGl0ZXJhdGlvbiBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L3N0cm9uZz4gSWYgbXVsdGlwbGUKLSAqIHRocmVhZHMgYWNjZXNzIGEgYmFnIGNvbmN1cnJlbnRseSwgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGhyZWFkcyBtb2RpZmllcwotICogdGhlIGJhZywgaXQgPGVtPm11c3Q8L2VtPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gVGhpcyBpcyB0eXBpY2FsbHkKLSAqIGFjY29tcGxpc2hlZCBieSBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcwotICogdGhlIGJhZy4gSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCB0aGUgYmFnIHNob3VsZCBiZSAid3JhcHBlZCIgdXNpbmcgdGhlCi0gKiA8Y29kZT5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uPC9jb2RlPiBtZXRob2QuIFRoaXMgaXMKLSAqIGJlc3QgZG9uZSBhdCBjcmVhdGlvbiB0aW1lLCB0byBwcmV2ZW50IGFjY2lkZW50YWwgdW5zeW5jaHJvbml6ZWQgYWNjZXNzCi0gKiB0byB0aGUgYmFnOgotICogPHByZT4KLSAqIENvbGxlY3Rpb24gYyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24obmV3IElkZW50aXR5SGFzaEJhZyguLi4pKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgY2xhc3MncyA8Y29kZT5pdGVyYXRvcjwvY29kZT4gbWV0aG9kIGFyZQotICogPGVtPmZhaWwtZmFzdDwvZW0+OiBpZiB0aGUgYmFnIGlzIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBpdGVyYXRvciBpcwotICogY3JlYXRlZCwgaW4gYW55IHdheSBleGNlcHQgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBvd24gPGNvZGU+cmVtb3ZlPC9jb2RlPgotICogbWV0aG9kLCB0aGUgaXRlcmF0b3IgdGhyb3dzIGEge0BsaW5rIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LgotICogVGh1cywgaW4gdGhlIGZhY2Ugb2YgY29uY3VycmVudCBtb2RpZmljYXRpb24sIHRoZSBpdGVyYXRvciBmYWlscyBxdWlja2x5Ci0gKiBhbmQgY2xlYW5seSwgcmF0aGVyIHRoYW4gcmlza2luZyBhcmJpdHJhcnksIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yIGF0Ci0gKiBhbiB1bmRldGVybWluZWQgdGltZSBpbiB0aGUgZnV0dXJlLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBhbiBpdGVyYXRvciBjYW5ub3QgYmUgZ3VhcmFudGVlZAotICogYXMgaXQgaXMsIGdlbmVyYWxseSBzcGVha2luZywgaW1wb3NzaWJsZSB0byBtYWtlIGFueSBoYXJkIGd1YXJhbnRlZXMgaW4gdGhlCi0gKiBwcmVzZW5jZSBvZiB1bnN5bmNocm9uaXplZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4gRmFpbC1mYXN0IGl0ZXJhdG9ycwotICogdGhyb3cgPGNvZGU+Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjwvY29kZT4gb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KLSAqIFRoZXJlZm9yZSwgaXQgd291bGQgYmUgd3JvbmcgdG8gd3JpdGUgYSBwcm9ncmFtIHRoYXQgZGVwZW5kZWQgb24gdGhpcwotICogZXhjZXB0aW9uIGZvciBpdHMgY29ycmVjdG5lc3M6IDxlbT50aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGl0ZXJhdG9ycwotICogc2hvdWxkIGJlIHVzZWQgb25seSB0byBkZXRlY3QgYnVncy48L2VtPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIG1haW50YWluZWQgYnkgdGhlIGJhZwotICogCi0gKiBAc2VlIENvbGxlY3Rpb24KLSAqIEBzZWUgQmFnCi0gKiBAc2VlIFN5bmNocm9uaXplZEJhZwotICogQHNlZQlDb2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hCYWc8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgaGFzaCB0YWJsZS4gUmVzaXplZCBhcyBuZWNlc3NhcnkuIExlbmd0aCBNVVNUIEFsd2F5cyBiZSBhIHBvd2VyIG9mIHR3by4gKi8KLQl0cmFuc2llbnQgRW50cnk8RT5bXSB0YWJsZTsKLQotCS8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHNpemUgPSAwOwotCi0JLyoqIFRoZSBudW1iZXIgb2YgdW5pcXVlIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHVuaXF1ZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBoYXNoIHRhYmxlIGlzIHJlaGFzaGVkIHdoZW4gaXRzIHNpemUgZXhjZWVkcyB0aGlzIHRocmVzaG9sZC4gKFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgKGludCkoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKS4pCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBpbnQgdGhyZXNob2xkOwotCi0JLyoqCi0JICogVGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgaGFzaCB0YWJsZS4KLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgYmFnIGhhcyBiZWVuIHN0cnVjdHVyYWxseSBtb2RpZmllZC4KLQkgKiBTdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgYXJlIHRob3NlIHRoYXQgY2hhbmdlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotCSAqIHRoZSBiYWcgb3Igb3RoZXJ3aXNlIG1vZGlmeSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIChlLmcuIHJlaGFzaCkuCi0JICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIG1ha2UgaXRlcmF0b3JzIG9uIHRoaXMgYmFnIGZhaWwtZmFzdC4KLQkgKgotCSAqIEBzZWUgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkgKi8KLQl0cmFuc2llbnQgaW50IG1vZENvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgLSBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkCi0JICogYnkgZWl0aGVyIG9mIHRoZSBjb25zdHJ1Y3RvcnMgd2l0aCBhcmd1bWVudHMuCi0JICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3byA8PSAxPDwzMC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMzA7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgdXNlZCB3aGVuIG5vbmUgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTYsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKCkgewotCQl0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRF9GQUNUT1IsIGZhbHNlKTsgIC8vIGZhbHNlID0gZG8gbm90IHZhbGlkYXRlIHBhcm1zCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHBhcmFtIGxvYWRGYWN0b3IgdGhlIGxvYWQgZmFjdG9yCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8gb3IgaWYgdGhlIGxvYWQgZmFjdG9yIGlzIG5vbi1wb3NpdGl2ZQotCSAqLwotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgdHJ1ZSk7ICAvLyB0cnVlID0gdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQlwcml2YXRlIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHZhbGlkYXRlUGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJaW50IGNhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotCQlpZiAodmFsaWRhdGVQYXJtcykgewotCQkJaWYgKGNhcGFjaXR5IDwgMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGNhcGFjaXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJCWNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKLQkJCX0KLQkJCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCS8vIGZpbmQgYSBwb3dlciBvZiAyID49ICdpbml0aWFsQ2FwYWNpdHknCi0JCQljYXBhY2l0eSA9IDE7Ci0JCQl3aGlsZSAoY2FwYWNpdHkgPCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCQljYXBhY2l0eSA8PD0gMTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoY2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBiYWcncyBsb2FkIGZhY3RvciB3aWxsIGJlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAwLjc1LAotCSAqIGFuZCBpdHMgaW5pdGlhbCBjYXBhY2l0eSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhNYXRoLm1heCgoaW50KSAoYy5zaXplKCkgLyBERUZBVUxUX0xPQURfRkFDVE9SKSArIDEsIERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSksIERFRkFVTFRfTE9BRF9GQUNUT1IpOwotCQl0aGlzLmFkZEFsbF8oYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGluZGV4KE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4KHRoaXMuaGFzaChvKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgaGFzaCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFzaChPYmplY3QgbykgewotCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogdGhpcy5yZWhhc2goU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpOwotCX0KLQotCS8qKgotCSAqIFR3ZWFrIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCByZWhhc2goaW50IGgpIHsKLQkJaCBePSAoaCA+Pj4yMCkgXiAoaCA+Pj4gMTIpOwotCQlyZXR1cm4gaCBeIChoID4+PiA3KSBeIChoID4+PiA0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGhhc2guCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXgoaW50IGhhc2gpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXgoaGFzaCwgdGhpcy50YWJsZS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaAotCSAqIHdpdGhpbiBhIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JaW50IGluZGV4KGludCBoYXNoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBoYXNoICYgKGxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkQWxsKENvbGxlY3Rpb24pfSBmb3IgY29uc3RydWN0aW9uIGFuZCBjbG9uaW5nLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsXyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQlmb3IgKEUgZSA6IGMpIHsKLQkJCXRoaXMuYWRkXyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkKE9iamVjdCl9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRfKEUgbykgewotCQl0aGlzLmFkZF8obywgMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0LCBpbnQpfSBmb3IgY29uc3RydWN0aW9uLCBjbG9uaW5nLCBhbmQgc2VyaWFsaXphdGlvbi4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvLCBpbnQgY250KSB7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBzaXplLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBzaXplIHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIG9iamVjdCdzIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHJpdmF0ZSBFbnRyeTxFPiBnZXRFbnRyeShPYmplY3QgbykgewotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW3RoaXMuaW5kZXgobyldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50cnkobykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+IGUgPSB0aGlzLmdldEVudHJ5KG8pOwotCQlyZXR1cm4gKGUgPT0gbnVsbCkgPyAwIDogZS5jb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZWhhc2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBiYWcgZXhjZWVkcyBpdHMKLQkgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQkJRW50cnk8RT5bXSBvbGRUYWJsZSA9IHRoaXMudGFibGU7Ci0JCWludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKLQotCQlpbnQgbmV3Q2FwYWNpdHkgPSBvbGRDYXBhY2l0eSAqIDIgKyAxOwotCQlFbnRyeTxFPltdIG5ld1RhYmxlID0gdGhpcy5idWlsZFRhYmxlKG5ld0NhcGFjaXR5KTsKLQotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChuZXdDYXBhY2l0eSAqIHRoaXMubG9hZEZhY3Rvcik7Ci0JCXRoaXMudGFibGUgPSBuZXdUYWJsZTsKLQotCQlmb3IgKGludCBpID0gb2xkQ2FwYWNpdHk7IGktLSA+IDA7ICkgewotCQkJZm9yIChFbnRyeTxFPiBvbGQgPSBvbGRUYWJsZVtpXTsgb2xkICE9IG51bGw7ICkgewotCQkJCUVudHJ5PEU+IGUgPSBvbGQ7Ci0JCQkJb2xkID0gb2xkLm5leHQ7Ci0KLQkJCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGUuaGFzaCwgbmV3Q2FwYWNpdHkpOwotCQkJCWUubmV4dCA9IG5ld1RhYmxlW2luZGV4XTsKLQkJCQluZXdUYWJsZVtpbmRleF0gPSBlOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRW50cnk8RT5bXSBidWlsZFRhYmxlKGludCBjYXBhY2l0eSkgewotCQlyZXR1cm4gbmV3IEVudHJ5W2NhcGFjaXR5XTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGQobywgMSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5tb2RDb3VudCsrOwotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChoYXNoKTsKLQotCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGJhZywgc2ltcGx5IGJ1bXAgaXRzIGNvdW50Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJZS5jb3VudCArPSBjbnQ7Ci0JCQkJdGhpcy5zaXplICs9IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgd2UgYXJlIGdvaW5nIHRvIGV4Y2VlZCB0aGUgdGhyZXNob2xkCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID49IHRoaXMudGhyZXNob2xkKSB7Ci0JCQl0aGlzLnJlaGFzaCgpOwotCQkJaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOyAgLy8gbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlIGluZGV4Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGhpcy50YWJsZVtpbmRleF0pOwotCQl0aGlzLnRhYmxlW2luZGV4XSA9IGU7Ci0JCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgPFQ+IEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeTxUPiBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnkoaGFzaCwgbywgY250LCBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZShvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgobyk7Ci0KLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQljbnQgPSAoY250IDwgZS5jb3VudCkgPyBjbnQgOiBlLmNvdW50OwotCQkJCWUuY291bnQgLT0gY250OwotCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBlbGVtZW50KHMpLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0aGlzLnRhYmxlW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQl0aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJfQotCQkJCXRoaXMuc2l6ZSAtPSBjbnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIG9iamVjdC1pZGVudGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBzdXBlci5yZW1vdmVBbGwobmV3IElkZW50aXR5SGFzaEJhZzxPYmplY3Q+KGMpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgb2JqZWN0LWlkZW50aXR5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHN1cGVyLnJldGFpbkFsbChuZXcgSWRlbnRpdHlIYXNoQmFnPE9iamVjdD4oYykpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsZWFycyBvdXQgYWxsIG9mIHRoZSBoYXNoIHRhYmxlIGJ1Y2tldHMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJdGhpcy5tb2RDb3VudCsrOwotCQlmb3IgKGludCBpID0gdGFiLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQl0YWJbaV0gPSBudWxsOwotCQl9Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JCXRoaXMudW5pcXVlQ291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWc6IHRoZSBlbGVtZW50cwotCSAqIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0JICoKLQkgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWc8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUlkZW50aXR5SGFzaEJhZzxFPiBjbG9uZSA9IChJZGVudGl0eUhhc2hCYWc8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQljbG9uZS50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZSh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQljbG9uZS5zaXplID0gMDsKLQkJCWNsb25lLnVuaXF1ZUNvdW50ID0gMDsKLQkJCWNsb25lLm1vZENvdW50ID0gMDsKLQkJCWNsb25lLmFkZEFsbF8odGhpcyk7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEhhc2ggdGFibGUgY29sbGlzaW9uIGxpc3QgZW50cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnk8RT4gaW1wbGVtZW50cyBCYWcuRW50cnk8RT4gewotCQlmaW5hbCBpbnQgaGFzaDsgIC8vIGNhY2hlIHRoZSBoYXNoIGZvciByZS1oYXNoZXMKLQkJZmluYWwgRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIGludCBjb3VudCwgRW50cnk8RT4gbmV4dCkgewotCQkJdGhpcy5oYXNoID0gaGFzaDsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJdGhpcy5uZXh0ID0gbmV4dDsKLQkJfQotCi0JCS8vICoqKioqIEJhZy5FbnRyeSBpbXBsZW1lbnRhdGlvbgotCQlwdWJsaWMgRSBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0KLQkJcHVibGljIGludCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCA8PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IG9sZCA9IHRoaXMuY291bnQ7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQlyZXR1cm4gb2xkOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnLkVudHJ5PD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQmFnLkVudHJ5IGUgPSAoQmFnLkVudHJ5KSBvOwotCQkJcmV0dXJuICh0aGlzLm9iamVjdCA9PSBlLmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgKHRoaXMuY291bnQgPT0gZS5nZXRDb3VudCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJRSBvID0gdGhpcy5vYmplY3Q7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogKHRoaXMuY291bnQgKiBvLmhhc2hDb2RlKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3QgKyAiPT4iICsgdGhpcy5jb3VudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgSGFzaEl0ZXJhdG9yKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ291bnQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG5leHRFbnRyeUNvdW50ID0gMDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCWludCBzbG90ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzbGlkZSBiYWNrIHRoZSBjb3VudCB0byBhY2NvdW50IGZvciB0aGUganVzdC1yZW1vdmVkIGVsZW1lbnQKLQkJCQkJCXRoaXMubmV4dEVudHJ5Q291bnQtLTsKLQkJCQkJfQotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5zaXplLS07Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFbnRyeTxFPj4gewotCQlwcml2YXRlIGludCBpbmRleCA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJRW50cnlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEVudHJ5PEU+IG5leHQoKSB7Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCXJldHVybiBlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQkvLyByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnNpemUgLT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5jb3VudDsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVW5pcXVlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgRW50cnlJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQkJCi0JCVVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLm5leHQoKS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLmVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJZGVudGl0eUhhc2hCYWc8Pz4pIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGIgPSAoSWRlbnRpdHlIYXNoQmFnPEU+KSBvOwotCQkJaWYgKGIuc2l6ZSgpICE9IHRoaXMuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGIudW5pcXVlQ291bnQoKSAhPSB0aGlzLnVuaXF1ZUNvdW50KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gc3RyZWFtID0gYi5lbnRyaWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCUJhZy5FbnRyeTxFPiBlbnRyeSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKGVudHJ5LmdldENvdW50KCkgIT0gdGhpcy5jb3VudChlbnRyeS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0aGlzLmVxdWFsc18obyk7Ci0JCX0KLS8vCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCYWc8Pz4pIHsKLS8vCQkJLy8gaG1tbS4uLgotLy8JCQlyZXR1cm4gbmV3IEhhc2hCYWc8T2JqZWN0Pih0aGlzKS5lcXVhbHMobyk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzXyhPYmplY3QgbykgewotCQkvLyBobW1tLi4uCi0JCXJldHVybiAobyBpbnN0YW5jZW9mIEJhZzw/PikgJiYgCi0JCQkJbmV3IEhhc2hCYWc8T2JqZWN0Pih0aGlzKS5lcXVhbHMobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEUgbyA6IHRoaXMpIHsKLQkJCWggKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZCBmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiBidWNrZXRzCi0JCXMud3JpdGVJbnQodGhpcy50YWJsZS5sZW5ndGgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCXMud3JpdGVJbnQodGhpcy51bmlxdWVDb3VudCk7Ci0KLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+IDApIHsKLQkJCWZvciAoRW50cnk8RT4gZW50cnkgOiB0aGlzLnRhYmxlKSB7Ci0JCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJcy53cml0ZU9iamVjdChlbnRyeS5vYmplY3QpOwotCQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQkJZW50cnkgPSBlbnRyeS5uZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogUmVjb25zdGl0dXRlIHRoZSBiYWcgZnJvbSBhIHN0cmVhbSAoaS5lLiBkZXNlcmlhbGl6ZSBpdCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiB0aGUgdGhyZXNob2xkLCBsb2FkZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0KLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0cyBhbmQgYWxsb2NhdGUgdGhlIGJ1Y2tldCBhcnJheQotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHMucmVhZEludCgpKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJaW50IHVuaXF1ZSA9IHMucmVhZEludCgpOwotCi0JCS8vIHJlYWQgdGhlIGVsZW1lbnRzIGFuZCBjb3VudHMsIGFuZCBwdXQgdGhlIGVsZW1lbnRzIGluIHRoZSBiYWcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWU7IGkrKykgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlFIGVsZW1lbnQgPSAoRSkgcy5yZWFkT2JqZWN0KCk7Ci0JCQlpbnQgZWxlbWVudENvdW50ID0gcy5yZWFkSW50KCk7Ci0JCQl0aGlzLmFkZF8oZWxlbWVudCwgZWxlbWVudENvdW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMmM3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFByaW50V3JpdGVyfSB0byBhdXRvbWF0aWNhbGx5IGluZGVudCBuZXcgbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRlbnRpbmdQcmludFdyaXRlciBleHRlbmRzIFByaW50V3JpdGVyIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGluZGVudDsKLQlwcml2YXRlIGludCBpbmRlbnRMZXZlbDsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNJbmRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0lOREVOVCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRhYnMuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQpIHsKLQkJdGhpcyhvdXQsIERFRkFVTFRfSU5ERU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQsIFN0cmluZyBpbmRlbnQpIHsKLQkJc3VwZXIob3V0KTsKLQkJdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0JCXRoaXMuaW5kZW50TGV2ZWwgPSAwOwotCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZmxhZyBzbyBmb2xsb3dpbmcgbGluZSBpcyBpbmRlbnRlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludGxuKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJc3VwZXIucHJpbnRsbigpOwotCQkJdGhpcy5uZWVkc0luZGVudCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgYXBwcm9wcmlhdGUgaW5kZW50LgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludEluZGVudCgpIHsKLQkJaWYgKHRoaXMubmVlZHNJbmRlbnQpIHsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSB0aGlzLmluZGVudExldmVsOyBpLS0gPiAwOyApIHsKLQkJCQl0aGlzLnByaW50KHRoaXMuaW5kZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIHN0cmluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUocywgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGVudCgpIHsKLQkJdGhpcy5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZGVudCgpIHsKLQkJdGhpcy5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQotCS8qKgotCSAqIEJ1bXAgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbC0tOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJcmV0dXJuIHRoaXMuaW5kZW50TGV2ZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgaW5kZW50IGxldmVsIHRvIGJlIHNldCBkaXJlY3RseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnRMZXZlbChpbnQgaW5kZW50TGV2ZWwpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JmOWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB3aGVyZXZlciBhIG11dGFibGUgaW50ZWdlciBvYmplY3QgaXMgbmVlZGVkLgotICogSXQgaXMgYSBjcm9zcyBiZXR3ZWVuIGFuIDxjb2RlPmludDwvY29kZT4gYW5kIGFuIHtAbGluayBJbnRlZ2VyfS4KLSAqIEl0IGNhbiBiZSBzdG9yZWQgaW4gYSBzdGFuZGFyZCBjb250YWluZXIgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ufSkKLSAqIGJ1dCBjYW4gYmUgbW9kaWZpZWQuIEl0IGlzIGFsc28gdXNlZnVsIHBhc3NpbmcgYSB2YWx1ZSB0aGF0IGNhbiBiZSBjaGFuZ2VkCi0gKiBieSB0aGUgcmVjaXBpZW50LgotICogCi0gKiBAc2VlIFN5bmNocm9uaXplZEludAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW50UmVmZXJlbmNlCi0JaW1wbGVtZW50cyBDb21wYXJhYmxlPEludFJlZmVyZW5jZT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+aW50PC9jb2RlPi4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIGludCB2YWx1ZSA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgPGNvZGU+aW50PC9jb2RlPiByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIEludFJlZmVyZW5jZShpbnQgY291bnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IGNvdW50OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIDxjb2RlPmludDwvY29kZT4gcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiB6ZXJvLgotCSAqLwotCXB1YmxpYyBJbnRSZWZlcmVuY2UoKSB7Ci0JCXRoaXMoMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbm90RXF1YWxzKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgemVyby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1plcm8oKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IHplcm8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RaZXJvKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW4oaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPiB2OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPj0gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDwgdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW5PckVxdWFsKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDw9IHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgcG9zaXRpdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiAoaS5lLiBuZWdhdGl2ZSBvciB6ZXJvKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFBvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBuZWdhdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCBuZWdhdGl2ZQotCSAqIChpLmUuIHplcm8gb3IgcG9zaXRpdmUpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90TmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW5PckVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCWludCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBhYnMoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gTWF0aC5hYnModGhpcy52YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBuZWcoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gLXRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB6ZXJvLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHNldFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKDApOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcGx1cyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgYWRkKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICs9IHY7Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IGFuZCByZXR1cm4gdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5jcmVtZW50KCkgewotCQlyZXR1cm4gKyt0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgbWludXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHN1YnRyYWN0KGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIC09IHY7Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IGFuZCByZXR1cm4gdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgZGVjcmVtZW50KCkgewotCQlyZXR1cm4gLS10aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgdGltZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG11bHRpcGx5KGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICo9IHY7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBkaXZpZGUoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgLz0gdjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgdmFsdWUgZGl2aWRlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCByZW1haW5kZXIoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgJT0gdjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBtaW5pbXVtIG9mIHRoZSBjdXJyZW50IHZhbHVlIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgbWluKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gTWF0aC5taW4odGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgbWF4aW11bSBvZiB0aGUgY3VycmVudCB2YWx1ZSBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG1heChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9IE1hdGgubWF4KHRoaXMudmFsdWUsIHYpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB0aGUnCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgcG93KGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gKGludCkgTWF0aC5wb3codGhpcy52YWx1ZSwgdik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oSW50UmVmZXJlbmNlIGlyKSB7Ci0JCWludCB2ID0gaXIuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPCB2ID8gLTEgOiAodGhpcy52YWx1ZSA9PSB2ID8gMCA6IDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgSW50UmVmZXJlbmNlKSAmJgotCQkJKHRoaXMudmFsdWUgPT0gKChJbnRSZWZlcmVuY2UpIG8pLnZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODk5ZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBKREJDIEFQSS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEQkNUb29scyB7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcgbWFwcGluZyA9IGphdmFUb0pEQkNUeXBlTWFwcGluZyhjbGFzc05hbWUpOwotCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgPyBERUZBVUxUX0pEQkNfVFlQRSA6IG1hcHBpbmcuZ2V0SkRCQ1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSkRCQyB0eXBlLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyBtYXBwaW5nID0gamRiY1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkFWQV9UWVBFIDogbWFwcGluZy5nZXRKYXZhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJcmV0dXJuIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChqZGJjVHlwZS5uYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZUNvZGUoaW50IGpkYmNUeXBlQ29kZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3IoSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIEpEQkMgPT4gSmF2YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEgdHlwZSBtYXBwaW5ncywga2V5ZWQgYnkgSkRCQyB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKQotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7ICAvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIGpkYmNUb0phdmFUeXBlTWFwcGluZyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCXJldHVybiBqZGJjVG9KYXZhVHlwZU1hcHBpbmdzKCkuZ2V0KGpkYmNUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+KCk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ3NUbyhtYXBwaW5ncyk7Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBoYXJkIGNvZGUgdGhlIGRlZmF1bHQgbWFwcGluZ3MgZnJvbSB0aGUgSkRCQyB0eXBlcyB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBKYXZhIHR5cGVzCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqIHNlZSAiSkRCQyAzLjAgU3BlY2lmaWNhdGlvbiIgQXBwZW5kaXggQgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkFSUkFZLCBqYXZhLnNxbC5BcnJheS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSUdJTlQsIGxvbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklULCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJMT0IsIGphdmEuc3FsLkJsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQk9PTEVBTiwgYm9vbGVhbi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5DSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNMT0IsIGphdmEuc3FsLkNsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREFUQUxJTkssIGphdmEubmV0LlVSTC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRFLCBqYXZhLnNxbC5EYXRlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRFQ0lNQUwsIGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRJU1RJTkNULCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRE9VQkxFLCBkb3VibGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRkxPQVQsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5JTlRFR0VSLCBpbnQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuSkFWQV9PQkpFQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTE9OR1ZBUkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotLy8JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLk5VTEwsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVNRVJJQywgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuT1RIRVIsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsJLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFQUwsIGZsb2F0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFRiwgamF2YS5zcWwuUmVmLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNNQUxMSU5ULCBzaG9ydC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5TVFJVQ1QsIGphdmEuc3FsLlN0cnVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5USU1FLCBqYXZhLnNxbC5UaW1lLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUVTVEFNUCwgamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTllJTlQsIGJ5dGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oaW50IGpkYmNUeXBlQ29kZSwgQ2xhc3M8Pz4gamF2YUNsYXNzLCBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKTsKLQkJT2JqZWN0IHByZXYgPSBtYXBwaW5ncy5wdXQoamRiY1R5cGUubmFtZSgpLCBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgamF2YUNsYXNzKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKREJDIHR5cGU6ICIgKyBqZGJjVHlwZS5uYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVG9KREJDVHlwZU1hcHBpbmcobmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyksIEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKREJDVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgewotCQlwcml2YXRlIGZpbmFsIEpEQkNUeXBlIGpkYmNUeXBlOwotCQlwcml2YXRlIGZpbmFsIEphdmFUeXBlIGphdmFUeXBlOwotCi0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyhKREJDVHlwZSBqZGJjVHlwZSwgSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmpkYmNUeXBlID0gamRiY1R5cGU7Ci0JCQl0aGlzLmphdmFUeXBlID0gamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZS5jb2RlKCkgPT0gamRiY1R5cGVDb2RlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZS5uYW1lKCkuZXF1YWxzKGpkYmNUeXBlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKEpEQkNUeXBlIHR5cGUpIHsKLQkJCXJldHVybiB0aGlzLmpkYmNUeXBlID09IHR5cGU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJdGhpcy5hcHBlbmRUbyhzYik7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXRoaXMuamRiY1R5cGUuYXBwZW5kVG8oc2IpOwotCQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuamF2YVR5cGUuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEphdmEgPT4gSkRCQwotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFUb0pEQkNUeXBlTWFwcGluZyB7Ci0JCXByaXZhdGUgZmluYWwgSmF2YVR5cGUgamF2YVR5cGU7Ci0JCXByaXZhdGUgZmluYWwgSkRCQ1R5cGUgamRiY1R5cGU7Ci0KLQkJSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKEphdmFUeXBlIGphdmFUeXBlLCBKREJDVHlwZSBqZGJjVHlwZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuamF2YVR5cGUgPSBqYXZhVHlwZTsKLQkJCXRoaXMuamRiY1R5cGUgPSBqZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKEphdmFUeXBlIGp0KSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoanQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGUuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzcyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJdGhpcy5hcHBlbmRUbyhzYik7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXRoaXMuamF2YVR5cGUuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5qZGJjVHlwZS5hcHBlbmRUbyhzYik7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxNDg3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci0KLS8qKgotICogQXNzb2NpYXRlIHRoZSBKYXZhIGNvbnN0YW50IGFuZCB0aGUgSkRCQyB0eXBlIG5hbWUuCi0gKiBUaGVzZSBhcmUgZGVyaXZlZCBmcm9tIGphdmEuc3FsLlR5cGVzLgotICogCi0gKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKREJDVHlwZQotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHRoZSBjb25zdGFudCBuYW1lIChlLmcuIFZBUkNIQVIpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHRoZSBKREJDIGNvZGUgdXNlZCBieSBKREJDIGRyaXZlcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBjb2RlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpEQkMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdHlwZSBjb2RlLgotCSAqIFRoaXMgaXMgcHJpdmF0ZSBiZWNhdXNlIGFsbCB0aGUgcG9zc2libGUgSkRCQyB0eXBlcyBhcmUgYnVpbHQgYW5kCi0JICogc3RvcmVkIGluIHRoZSBzdGF0aWMgYXJyYXkgVFlQRVMuCi0JICogQHNlZSAjdHlwZXMoKQotCSAqLwotCXByaXZhdGUgSkRCQ1R5cGUoU3RyaW5nIG5hbWUsIGludCBjb2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY29kZSA9IGNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBuYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGNvZGUsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMuCi0JICovCi0JcHVibGljIGludCBjb2RlKCkgewotCQlyZXR1cm4gdGhpcy5jb2RlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKREJDVHlwZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSkRCQ1R5cGUpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBzdHVmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhbGwgdGhlIEpEQkMgdHlwZSBkZWZpbmVkIGluIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1R5cGVbXSBUWVBFUzsJCS8vIHBzZXVkbyAnZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKREJDVHlwZVtdIHR5cGVzKCkgewotCQlpZiAoVFlQRVMgPT0gbnVsbCkgewotCQkJVFlQRVMgPSBidWlsZFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIFRZUEVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgY29kZSAoZS5nLiBUeXBlcy5WQVJDSEFSKS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSB0eXBlKGludCBjb2RlKSB7Ci0JCUpEQkNUeXBlW10gdHlwZXMgPSB0eXBlcygpOwotCQlmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0eXBlc1tpXS5jb2RlKCkgPT0gY29kZSkgewotCQkJCXJldHVybiB0eXBlc1tpXTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEpEQkMgdHlwZSBjb2RlOiAiICsgY29kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSB0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCUpEQkNUeXBlW10gdHlwZXMgPSB0eXBlcygpOwotCQlmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0eXBlc1tpXS5uYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHR5cGVzW2ldOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSkRCQyB0eXBlIG5hbWU6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHVwIHRoZSBKREJDIHR5cGVzIHZpYSByZWZsZWN0aW9uCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gYnVpbGRUeXBlcygpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlpbnQgbGVuID0gZmllbGRzLmxlbmd0aDsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IG5ldyBKREJDVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCWludCBjb2RlOwotCQkJdHJ5IHsKLQkJCQljb2RlID0gKChJbnRlZ2VyKSBmaWVsZHNbaV0uZ2V0KG51bGwpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsJLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotCQkJfQotCQkJdHlwZXNbaV0gPSBuZXcgSkRCQ1R5cGUobmFtZSwgY29kZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0xpc3RlbmVyTGlzdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0xpc3RlbmVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNiNzhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotLyoqCi0gKiBNYWludGFpbiBhIHRocmVhZC1zYWZlIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgZG9lcyBub3QgYWxsb3cgYWRkaW5nCi0gKiBkdXBsaWNhdGUgbGlzdGVuZXJzIG9yIHJlbW92aW5nIG5vbi1saXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3Q8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKioKLQkgKiBXZSBjYW4gbWFyayB0aGlzIHZvbGF0aWxlIGFuZCBub3Qgc3luY2hyb25pemUgdGhlIHJlYWQgbWV0aG9kcyBiZWNhdXNlCi0JICogd2UgbmV2ZXIgY2hhbmdlIHRoZSA8ZW0+Y29udGVudHM8L2VtPiBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgTFtdIGxpc3RlbmVyczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciBsaXN0IGZvciBsaXN0ZW5lcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDApOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIGxpc3QgZm9yIGxpc3RlbmVycyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RlbmVyTGlzdChDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDEpOwotCQl0aGlzLmxpc3RlbmVyc1swXSA9IGxpc3RlbmVyOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTFtdIGJ1aWxkTGlzdGVuZXJBcnJheShDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiAoTFtdKSBBcnJheS5uZXdJbnN0YW5jZShsaXN0ZW5lckNsYXNzLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxMPiBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMPih0aGlzLmxpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdGVuZXIgbGlzdCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVycy5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKiBEdXBsaWNhdGUgbGlzdGVuZXJzIGFyZSBub3QgYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEwgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0LgotCSAqIFJlbW92aW5nIGEgbGlzdGVuZXIgdGhhdCBpcyBub3Qgb24gdGhlIGxpc3QgaXMgbm90IGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShMIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2YodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnJlZ2lzdGVyZWQgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgodGhpcy5saXN0ZW5lcnMsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5jbGVhcih0aGlzLmxpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIGxpc3RlbmVycyBoZWxkIGJ5IHRoZSBsaXN0ZW5lciBsaXN0LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDbGFzczxMPiBnZXRMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiAoQ2xhc3M8TD4pIHRoaXMubGlzdGVuZXJzLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBBcnJheXMudG9TdHJpbmcodGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNpbGVudGx5IGRyb3AgYW55IG5vbi1zZXJpYWxpemFibGUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUNsYXNzPEw+IGxpc3RlbmVyQ2xhc3MgPSAoQ2xhc3M8TD4pIHRoaXMubGlzdGVuZXJzLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyQ2xhc3MpOwotCi0JCS8vIG9ubHkgd3JpdGUgb3V0IHNlcmlhbGl6YWJsZSBsaXN0ZW5lcnMKLQkJZm9yIChMIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgewotCQkJCXMud3JpdGVPYmplY3QobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJcy53cml0ZU9iamVjdChudWxsKTsKLSAgICB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyByZWFkIGluIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCUNsYXNzPEw+IGxpc3RlbmVyQ2xhc3MgPSAoQ2xhc3M8TD4pIHMucmVhZE9iamVjdCgpOwotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDApOwotCQlPYmplY3QgbzsKLQkJd2hpbGUgKChvID0gcy5yZWFkT2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5saXN0ZW5lcnMsIChMKSBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjFhN2M3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi0vKioKLSAqIFZhcmlvdXMgaGVscGVyIG1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgbmFtZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lVG9vbHMgewotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgQ29sbGVjdGlvblRvb2xzLnNldChleGlzdGluZ05hbWVzKSk7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBib3RoIGFsbG93ZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgZXhpc3RpbmdOYW1lcywgcm9vdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBOT1QgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgTk9UIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoU3RyaW5nIHJvb3ROYW1lLCBJdGVyYXRvcjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgTk9UIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIE5PVCBib3RoIGFsbG93ZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3Iocm9vdE5hbWUsIGNvbnZlcnRUb0xvd2VyQ2FzZShleGlzdGluZ05hbWVzKSwgcm9vdE5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogdXNlIHRoZSBzdWZmaXhlZCAidGVtcGxhdGUiIG5hbWUgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbnMsIGJ1dCBSRVRVUk4KLQkgKiB0aGUgc3VmZml4ZWQgInJvb3QiIG5hbWU7IHRoaXMgYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKLQkgKiAoaS5lLiB0aGUgInRlbXBsYXRlIiBuYW1lIGhhcyBiZWVuIG1vcnBoZWQgdG8gdGhlIHNhbWUgY2FzZSBhcwotCSAqIHRoZSAiZXhpc3RpbmciIG5hbWVzLCB3aGlsZSB0aGUgInJvb3QiIG5hbWUgaGFzIG5vdCwgYnV0IHRoZSAicm9vdCIgbmFtZQotCSAqIGlzIHdoYXQgdGhlIGNsaWVudCB3YW50cyBtb3JwaGVkIHRvIGJlIHVuaXF1ZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzLCBTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCWlmICggISBleGlzdGluZ05hbWVzLmNvbnRhaW5zKHRlbXBsYXRlTmFtZSkpIHsKLQkJCXJldHVybiByb290TmFtZTsKLQkJfQotCQlTdHJpbmcgdW5pcXVlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJZm9yIChpbnQgc3VmZml4ID0gMjsgdHJ1ZTsgc3VmZml4KyspIHsKLQkJCWlmICggISBleGlzdGluZ05hbWVzLmNvbnRhaW5zKHVuaXF1ZU5hbWUgKyBzdWZmaXgpKSB7Ci0JCQkJcmV0dXJuIHJvb3ROYW1lLmNvbmNhdChTdHJpbmcudmFsdWVPZihzdWZmaXgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHN0cmluZ3MgdG8gYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lCi0JICogc3RyaW5ncyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBIYXNoU2V0PFN0cmluZz4gY29udmVydFRvTG93ZXJDYXNlKENvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHN0cmluZ3Muc2l6ZSgpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogc3RyaW5ncykgewotCQkJcmVzdWx0LmFkZChzdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdC4KLQkgKiBWYXJpYXRpb25zOgotCSAqICAgICBjYXRhbG9nLnNjaGVtYS5uYW1lCi0JICogICAgIGNhdGFsb2cuLm5hbWUKLQkgKiAgICAgc2NoZW1hLm5hbWUKLQkgKiAgICAgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGNhdGFsb2cgPT0gbnVsbCkgJiYgKHNjaGVtYSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKGNhdGFsb2cpOwotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoc2NoZW1hKTsKLQkJfQotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFfUkVTRVJWRURfV09SRFMgPSBuZXcgU3RyaW5nW10gewotCQkJCSJhYnN0cmFjdCIsCi0JCQkJImFzc2VydCIsICAvLyBqZGsgMS40Ci0JCQkJImJvb2xlYW4iLAotCQkJCSJicmVhayIsCi0JCQkJImJ5dGUiLAotCQkJCSJjYXNlIiwKLQkJCQkiY2F0Y2giLAotCQkJCSJjaGFyIiwKLQkJCQkiY2xhc3MiLAotCQkJCSJjb25zdCIsICAvLyB1bnVzZWQKLQkJCQkiY29udGludWUiLAotCQkJCSJkZWZhdWx0IiwKLQkJCQkiZG8iLAotCQkJCSJkb3VibGUiLAotCQkJCSJlbHNlIiwKLQkJCQkiZW51bSIsICAvLyBqZGsgMS41Ci0JCQkJImV4dGVuZHMiLAotCQkJCSJmYWxzZSIsCi0JCQkJImZpbmFsIiwKLQkJCQkiZmluYWxseSIsCi0JCQkJImZsb2F0IiwKLQkJCQkiZm9yIiwKLQkJCQkiZ290byIsICAvLyB1bnVzZWQKLQkJCQkiaWYiLAotCQkJCSJpbXBsZW1lbnRzIiwKLQkJCQkiaW1wb3J0IiwKLQkJCQkiaW5zdGFuY2VvZiIsCi0JCQkJImludCIsCi0JCQkJImludGVyZmFjZSIsCi0JCQkJImxvbmciLAotCQkJCSJuYXRpdmUiLAotCQkJCSJuZXciLAotCQkJCSJudWxsIiwKLQkJCQkicGFja2FnZSIsCi0JCQkJInByaXZhdGUiLAotCQkJCSJwcm90ZWN0ZWQiLAotCQkJCSJwdWJsaWMiLAotCQkJCSJyZXR1cm4iLAotCQkJCSJzaG9ydCIsCi0JCQkJInN0YXRpYyIsCi0JCQkJInN0cmljdGZwIiwgIC8vIGpkayAxLjIKLQkJCQkic3VwZXIiLAotCQkJCSJzd2l0Y2giLAotCQkJCSJzeW5jaHJvbml6ZWQiLAotCQkJCSJ0aGlzIiwKLQkJCQkidGhyb3ciLAotCQkJCSJ0aHJvd3MiLAotCQkJCSJ0cmFuc2llbnQiLAotCQkJCSJ0cnVlIiwKLQkJCQkidHJ5IiwKLQkJCQkidm9pZCIsCi0JCQkJInZvbGF0aWxlIiwKLQkJCQkid2hpbGUiCi0JCQl9OwotCi0JLyoqCi0JICogVGhlIHNldCBvZiByZXNlcnZlZCB3b3JkcyBpbiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZS4KLQkgKiBUaGVzZSB3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycyAoaS5lLiBuYW1lcykuCi0JICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTb3J0ZWRTZXQ8U3RyaW5nPiBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVCA9IAotCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChKQVZBX1JFU0VSVkVEX1dPUkRTKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHJlc2VydmVkIHdvcmRzLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YVJlc2VydmVkV29yZHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBVkFfUkVTRVJWRURfV09SRFMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnNpc3RzIG9mIEphdmEgaWRlbnRpZmllcgotCSAqIGNoYXJhY3RlcnMgKGJ1dCBtYXkgYmUgYSByZXNlcnZlZCB3b3JkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhzdHJpbmcudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29uc2lzdHMgb2YgSmF2YSBpZGVudGlmaWVyCi0JICogY2hhcmFjdGVycyAoYnV0IG1heSBiZSBhIHJlc2VydmVkIHdvcmQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgc3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVyc18oY2hhcltdIHN0cmluZykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gTkI6IGVuZCB3aXRoIDEKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoc3RyaW5nKQotCQkJCSYmICEgSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoc3RyaW5nKQotCQkJCSYmICEgSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMobmV3IFN0cmluZyhzdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIGFuIHVuZGVyc2NvcmUgJ18nIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgJ18nIHRvIHRoZSBzdHJpbmcgaWYKLQkgKiBpdCBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcsICdfJyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kLCBpZiBuZWNlc3NhcnksIGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIHRvIHRoZSBzdHJpbmcgdW50aWwgaXQgaXMgbm90IGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCS8vIGEgcmVzZXJ2ZWQgd29yZCBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdlIGp1c3QgbmVlZCB0byB0d2VhayBpdCBhIGJpdAotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nICsgYywgYyk7Ci0JCX0KLQkJY2hhcltdIGFycmF5ID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oYXJyYXksIGMpID8gbmV3IFN0cmluZyhhcnJheSkgOiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyBhbiB1bmRlcnNjb3JlICdfJyBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kIGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlICdfJyB0byB0aGUgc3RyaW5nIGlmCi0JICogaXQgaXMgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nLCAnXycpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCwgaWYgbmVjZXNzYXJ5LCBhcHBlbmRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiB0byB0aGUgc3RyaW5nIHVudGlsIGl0IGlzIG5vdCBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMobmV3IFN0cmluZyhzdHJpbmcpKSkgewotCQkJLy8gYSByZXNlcnZlZCB3b3JkIGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2UganVzdCBuZWVkIHRvIHR3ZWFrIGl0IGEgYml0Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihBcnJheVRvb2xzLmFkZChzdHJpbmcsIGMpLCBjKTsKLQkJfQotCQljb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oc3RyaW5nLCBjKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHN0cmluZyBtdXN0IG5vdCBiZSBlbXB0eS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIHdhcyBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJYm9vbGVhbiBtb2QgPSBmYWxzZTsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCQkJc3RyaW5nWzBdID0gYzsKLQkJCW1vZCA9IHRydWU7Ci0JCX0KLQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIE5COiBlbmQgd2l0aCAxCi0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN0cmluZ1tpXSkpIHsKLQkJCQlzdHJpbmdbaV0gPSBjOwotCQkJCW1vZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHN0YXJ0IGNoYXI6ICciICsgYyArICdcJycpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKYXZhIGlkZW50aWZpZXIgcGFydCBjaGFyOiAnIiArIGMgKyAnXCcnKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBtZXRob2QgbmFtZSB0byBhIHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEdldHRlck1ldGhvZE5hbWVUb1Byb3BlcnR5TmFtZShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlpbnQgYmVnaW5JbmRleCA9IDA7Ci0JCWlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWJlZ2luSW5kZXggPSAzOwotCQl9IGVsc2UgaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQliZWdpbkluZGV4ID0gMjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtZXRob2ROYW1lOyAgLy8gcmV0dXJuIG1ldGhvZCBuYW1lIHVuY2hhbmdlZD8KLQkJfQotCQlyZXR1cm4gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtZXRob2ROYW1lLnN1YnN0cmluZyhiZWdpbkluZGV4KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBOYW1lVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05vdE51bGxGaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzE1ZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05vdE51bGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciBhY2NlcHRzIG9ubHkgbm9uLW51bGwgb2JqZWN0cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vdE51bGxGaWx0ZXI8VD4KLQlpbXBsZW1lbnRzIEZpbHRlcjxUPiwgU2VyaWFsaXphYmxlCi17Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgTm90TnVsbEZpbHRlcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgTm90TnVsbEZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyBhY2NlcHQgb25seSBub24tbnVsbCBvYmplY3RzCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gbyAhPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvTnVsbExpc3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDE5YjVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSAibnVsbCIgbGlzdCBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBhbiAiZW1wdHkiIGxpc3Q6IGl0IGFsbG93cyBjbGllbnRzIHRvCi0gKiBhZGQvcmVtb3ZlIGVsZW1lbnRzIHRvL2Zyb20gaXQgYnV0IG5ldmVyIGNoYW5nZXMuIFRoaXMgaXMgdXNlZnVsCi0gKiBmb3IgcGFzc2luZyB0byBtZXRob2RzIHRoYXQgcmVxdWlyZSBhICJjb2xsZWN0aW5nIHBhcmFtZXRlciIgYnV0IHRoZQotICogY2xpZW50IHdpbGwgaWdub3JlIHRoZSByZXN1bHRpbmcgImNvbGxlY3Rpb24iLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExpc3Q8RT4KLQlpbXBsZW1lbnRzIExpc3Q8RT4sIFNlcmlhbGl6YWJsZQotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbExpc3QgSU5TVEFOQ0UgPSBuZXcgTnVsbExpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbExpc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkvLyBpZ25vcmUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gYy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gYTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL09iamVjdFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL09iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk0Y2MxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9PYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogUHJvdmlkZSBhIGNvbnRhaW5lciBmb3IgcGFzc2luZyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB0aGUgcmVjaXBpZW50LgotICogCi0gKiBAc2VlIFN5bmNocm9uaXplZE9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0UmVmZXJlbmNlPFY+Ci0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgViB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0UmVmZXJlbmNlKFYgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBPYmplY3RSZWZlcmVuY2UoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVFcXVhbHMoViB2KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZU5vdEVxdWFsKFYgdikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROdWxsKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBzZXROdWxsKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0UmVmZXJlbmNlPFY+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlPYmplY3RSZWZlcmVuY2U8Vj4gY2xvbmUgPSAoT2JqZWN0UmVmZXJlbmNlPFY+KSBzdXBlci5jbG9uZSgpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgT2JqZWN0UmVmZXJlbmNlPD8+KSAmJgotCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy52YWx1ZSwgKChPYmplY3RSZWZlcmVuY2U8Pz4pIG9iaikudmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IDAgOiB0aGlzLnZhbHVlLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpICsgJ10nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5YjFmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNsYXNzaWMgcXVldWUgYmVoYXZpb3IsCi0gKiB3aXRob3V0IHRoZSBiYWNrZG9vcnMgYWxsb3dlZCBieSB7QGxpbmsgamF2YS51dGlsLlF1ZXVlfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHF1ZXVlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVldWU8RT4gewotCi0JLyoqCi0JICogIkVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUuCi0JICovCi0Jdm9pZCBlbnF1ZXVlKEUgbyk7Ci0KLQkvKioKLQkgKiAiRGVxdWV1ZSIgYW4gaXRlbSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLQkgKi8KLQlFIGRlcXVldWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBvbiB0aGUgaGVhZCBvZiB0aGUgcXVldWUKLQkgKiB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIHF1ZXVlLgotCSAqLwotCUUgcGVlaygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHF1ZXVlIGlzIGVtcHR5LgotCSAqLwotCWJvb2xlYW4gaXNFbXB0eSgpOwotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPiBpbXBsZW1lbnRzIFF1ZXVlPEU+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBRdWV1ZSBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8VD4gUXVldWU8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcGVlaygpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjkxOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBzaW1wbGUgY29udGFpbmVyIGNsYXNzIHNpbXBseSBwdXRzIGEgYml0IG9mIHNlbWFudGljcwotICogYXJvdW5kIGEgcGFpciBvZiBudW1iZXJzLgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2UKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgcmFuZ2UuICovCi0JcHVibGljIGZpbmFsIGludCBzdGFydDsKLQotCS8qKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSByYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgaW50IGVuZDsKLQotCS8qKgotCSAqIFRoZSBzaXplIGNhbiBiZSBuZWdhdGl2ZSBpZiB0aGUgZW5kaW5nIGluZGV4Ci0JICogaXMgbGVzcyB0aGFuIHRoZSBzdGFydGluZyBpbmRleC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHNpemU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kLAotCSAqIGJvdGggb2Ygd2hpY2ggYXJlIGltbXV0YWJsZS4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCXRoaXMuc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmFuZ2UgaW5jbHVkZXMgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuc3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSB0aGlzLmVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJhbmdlIG90aGVyUmFuZ2UgPSAoUmFuZ2UpIG87Ci0JCXJldHVybiAodGhpcy5zdGFydCA9PSBvdGhlclJhbmdlLnN0YXJ0KQotCQkJJiYgKHRoaXMuZW5kID09IG90aGVyUmFuZ2UuZW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zdGFydCBeIHRoaXMuZW5kOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSYW5nZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoUmFuZ2UpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIHRoaXMuc3RhcnQgKyAiLCAiICsgdGhpcy5lbmQgKyAnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzAxZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogVGhpcyBjb21wYXJhdG9yIHdpbGwgcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgotICogSWYgdGhlIGNvbXBhcmF0b3IgaXMgbnVsbCwgdGhlIG5hdHVyYWwgb3JkZXJpbmcgb2YgdGhlIG9iamVjdHMgd2lsbCBiZSB1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgUmV2ZXJzZUNvbXBhcmF0b3I8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4KLQlpbXBsZW1lbnRzIENvbXBhcmF0b3I8RT4sIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yOwotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCXB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoRSBlMSwgRSBlMikgewotCQlyZXR1cm4gKHRoaXMuY29tcGFyYXRvciA9PSBudWxsKSA/Ci0JCQllMi5jb21wYXJlVG8oZTEpCi0JCToKLQkJCXRoaXMuY29tcGFyYXRvci5jb21wYXJlKGUyLCBlMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVDb21tYW5kLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTVlZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1J1bm5hYmxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogV3JhcCBhIFJ1bm5hYmxlIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgQ29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZTsKLQotCXB1YmxpYyBSdW5uYWJsZUNvbW1hbmQoUnVubmFibGUgcnVubmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHJ1bm5hYmxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0aGlzLnJ1bm5hYmxlLnJ1bigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQ29tbWFuZFsiICsgdGhpcy5ydW5uYWJsZS50b1N0cmluZygpICsnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOWIwYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIEFzc29jaWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb248SywgVj4KLQlleHRlbmRzIEFic3RyYWN0QXNzb2NpYXRpb248SywgVj4KLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBLIGtleTsKLQlwcml2YXRlIFYgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLQkgKiBhbmQgYSBudWxsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvbihLIGtleSkgewotCQlzdXBlcigpOwotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uKEsga2V5LCBWIHZhbHVlKSB7Ci0JCXRoaXMoa2V5KTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JcHVibGljIEsga2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBWIHZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3luY2hyb25pemVkIFNpbXBsZUFzc29jaWF0aW9uPEssIFY+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVDb21tYW5kRXhlY3V0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0OTc3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENhbGxiYWNrU3RhdGVmdWxDb21tYW5kRXhlY3V0b3J9LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29tbWFuZEV4ZWN1dG9yCi0JaW1wbGVtZW50cyBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcgotewotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKLQotCXB1YmxpYyBTaW1wbGVDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCWlmICh0aGlzLmFjdGl2ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHN0b3BwZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFjdGl2ZSA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJaWYgKHRoaXMuYWN0aXZlKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWlmICggISB0aGlzLmFjdGl2ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFjdGl2ZSA9IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGUyMWY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFNpbXBsZSwgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+RmlsdGVyPC9jb2RlPgotICogdGhhdCBob2xkcyBvbiB0byBhIGNyaXRlcmlvbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUKLSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBvciA8Y29kZT5yZWplY3QoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZHMuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGVpdGhlciBvZiB0aGVzZSBtZXRob2RzLAotICogZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGVhc2llciB0byBpbXBsZW1lbnQuIE5vdGUgdGhhdCBhdCBsZWFzdAotICogb25lIG9mIHRoZXNlIG1ldGhvZHMgPGVtPm11c3Q8L2VtPiBiZSBvdmVycmlkZGVuIG9yCi0gKiBhbiBpbmZpbml0ZSBsb29wIHdpbGwgb2NjdXIuIElmIGJvdGggb2YgdGhlbSBhcmUgb3ZlcnJpZGRlbiwKLSAqIG9ubHkgdGhlIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSB1c2VkLgotICogPHA+Ci0gKiBTaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJhaWdodGZvcndhcmQgaW5uZXIgY2xhc3Nlcy4KLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGZpbHRlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEKLSAqIDxjb2RlPkZpbHRlcmluZ0l0ZXJhdG9yPC9jb2RlPiB0byByZXR1cm4gb25seSB0aG9zZSBzdHJpbmdzCi0gKiBpbiB0aGUgbmVzdGVkIGl0ZXJhdG9yIHN0YXJ0IHdpdGggInByZWZpeCI6Ci0gKiA8cHJlPgotICoJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmc+KCJwcmVmaXgiKSB7Ci0gKgkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBvKSB7Ci0gKgkJCXJldHVybiBvLnN0YXJ0c1dpdGgoKFN0cmluZykgY3JpdGVyaW9uKTsKLSAqCQl9Ci0gKgl9OwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVGaWx0ZXI8VCwgUz4KLQlpbXBsZW1lbnRzIEZpbHRlcjxUPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgUyBjcml0ZXJpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogTW9yZSB1c2VmdWwgY29uc3RydWN0b3IuIFRoZSBzcGVjaWZpZWQgY3JpdGVyaW9uIGNhbgotCSAqIGJlIHVzZWQgYnkgYSBzdWJjbGFzcyB0byAiYWNjZXB0IiBvciAicmVqZWN0IiBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVGaWx0ZXIoUyBjcml0ZXJpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jcml0ZXJpb24gPSBjcml0ZXJpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc2ltcGxlIGZpbHRlciB3aXRoIGEgbnVsbCBjcml0ZXJpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlRmlsdGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBzaG91bGQgYmUgInJlamVjdGVkIi4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZWplY3RlZCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlamVjdChUIG8pIHsKLQkJcmV0dXJuICEgdGhpcy5hY2NlcHQobyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAiYWNjZXB0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLnJlamVjdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU2ltcGxlRmlsdGVyPFQsIFM+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVGaWx0ZXI8VCwgUz4pIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFNpbXBsZUZpbHRlcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTaW1wbGVGaWx0ZXI8PywgPz4gb3RoZXIgPSAoU2ltcGxlRmlsdGVyPD8sID8+KSBvOwotCQlyZXR1cm4gKHRoaXMuY3JpdGVyaW9uID09IG51bGwpID8KLQkJCShvdGhlci5jcml0ZXJpb24gPT0gbnVsbCkgOiB0aGlzLmNyaXRlcmlvbi5lcXVhbHMob3RoZXIuY3JpdGVyaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMuY3JpdGVyaW9uID09IG51bGwpID8gMCA6IHRoaXMuY3JpdGVyaW9uLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jcml0ZXJpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUphdmFUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxMTEwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBKYXZhVHlwZX0gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlSmF2YVR5cGUKLQlpbXBsZW1lbnRzIEphdmFUeXBlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogc3RvcmUgdGhlIHR5cGUgYXMgYSBuYW1lLCBzbyB3ZSBjYW4gcmVmZXJlbmNlIGNsYXNzZXMKLQkgKiB0aGF0IGFyZSBub3QgbG9hZGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lOwotCi0JLyoqCi0JICogbm9uLWFycmF5IHR5cGVzIGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGFycmF5RGVwdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBQ0tFVFMgPSAiW10iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlIGFuZCBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChlbGVtZW50VHlwZU5hbWUgPT0gbnVsbCkgfHwgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBuYW1lIGlzIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoZWxlbWVudFR5cGVOYW1lKSAhPSAwKSB7CQkvLyBlLmcuICJbTGphdmEubGFuZy5PYmplY3Q7IgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBtdXN0IG5vdCBiZSBhbiBhcnJheTogIiArIGVsZW1lbnRUeXBlTmFtZSArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoYXJyYXlEZXB0aCA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhcnJheSBkZXB0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkgJiYgKGFycmF5RGVwdGggIT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIid2b2lkJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCXRoaXMuYXJyYXlEZXB0aCA9IGFycmF5RGVwdGg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBjbGFzcyBuYW1lIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3Jtczo8dWw+PGNvZGU+Ci0JICogPGxpPmphdmEubGFuZy5PYmplY3QKLQkgKiA8bGk+aW50Ci0JICogPGxpPmphdmEudXRpbC5NYXAkRW50cnkKLQkgKiA8bGk+W0xqYXZhLmxhbmcuT2JqZWN0OwotCSAqIDxsaT5bSQotCSAqIDxsaT5bTGphdmEudXRpbC5NYXAkRW50cnk7Ci0JICogPC9jb2RlPjwvdWw+Ci0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0JCXRoaXMoQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzc05hbWUpLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl0aGlzKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFycmF5RGVwdGgoKSB7Ci0JCXJldHVybiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlEZXB0aCA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzUHJpbWl0aXZlKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyh0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIENsYXNzPD8+IGdldEphdmFDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlckVsZW1lbnRUeXBlTmFtZSwgaW50IG90aGVyQXJyYXlEZXB0aCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSBvdGhlckFycmF5RGVwdGgpCi0JCQkmJiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5lcXVhbHMob3RoZXJFbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoY2xhc3NOYW1lKSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZXNjcmliZXMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0aGlzLmRlc2NyaWJlcyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSmF2YVR5cGUgb3RoZXIpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKG90aGVyLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBvdGhlci5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKHRoaXMgPT0gbykgPyB0cnVlIDogKG8gaW5zdGFuY2VvZiBKYXZhVHlwZSkgPyB0aGlzLmVxdWFscygoSmF2YVR5cGUpIG8pIDogZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLmhhc2hDb2RlKCkgXiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb24oKSB7Ci0JCWlmICh0aGlzLmFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKTsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5lbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgKyAoMiAqIHRoaXMuYXJyYXlEZXB0aCkpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmREZWNsYXJhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKSk7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEJSQUNLRVRTKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50RGVjbGFyYXRpb25PbihQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCh0aGlzLmdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkpOwotCQlmb3IgKGludCBpID0gdGhpcy5hcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXB3LnByaW50KEJSQUNLRVRTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT4nJCc8L2NvZGU+IHZlcnNpb24gb2YgdGhlIG5hbWUgaXMgdXNlZCBpbiB7QGxpbmsgQ2xhc3MjZm9yTmFtZShTdHJpbmcpfSwKLQkgKiBidXQgdGhlIDxjb2RlPicuJzwvY29kZT4gdmVyc2lvbiBvZiB0aGUgbmFtZSBpcyB1c2VkIGluIHNvdXJjZSBjb2RlLgotCSAqIFZlcnkgaXJyaXRhdGluZy4uLi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLnJlcGxhY2UoJyQnLCAnLicpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQyNmRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1ldGhvZFNpZ25hdHVyZSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVNZXRob2RTaWduYXR1cmUKLQlpbXBsZW1lbnRzIE1ldGhvZFNpZ25hdHVyZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogc3RvcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBhcyBuYW1lcywgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVR5cGVbXSBFTVBUWV9QQVJBTUVURVJfVFlQRVMgPSBuZXcgSmF2YVR5cGVbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NFUEFSQVRPUiA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKLQkgKiBubyBwYXJhbWV0ZXIgdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIEVNUFRZX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyCi0JICogdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgSmF2YVR5cGUuLi4gcGFyYW1ldGVyVHlwZXMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZSBpcyByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIHR5cGVzIGFyZSByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNoZWNrUGFyYW1ldGVyVHlwZXMocGFyYW1ldGVyVHlwZXMpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BhcmFtZXRlclR5cGVzKEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlclR5cGVzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciB0eXBlOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChwYXJhbWV0ZXJUeXBlc1tpXS5nZXRFbGVtZW50VHlwZU5hbWUoKS5lcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBwYXJhbWV0ZXIgdHlwZSBvZiAndm9pZCcgaXMgbm90IGFsbG93ZWQ6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyCi0JICogdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIHBhcmFtZXRlclR5cGVOYW1lcykgewotCQl0aGlzKG5hbWUsIGJ1aWxkUGFyYW1ldGVyVHlwZXMocGFyYW1ldGVyVHlwZU5hbWVzKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVR5cGVbXSBidWlsZFBhcmFtZXRlclR5cGVzKFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcykgewotCQlpZiAocGFyYW1ldGVyVHlwZU5hbWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgdHlwZSBuYW1lcyBhcmUgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzID0gbmV3IEphdmFUeXBlW3BhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlclR5cGVOYW1lc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgdHlwZSBuYW1lOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhcmFtZXRlclR5cGVzW2ldID0gbmV3IFNpbXBsZUphdmFUeXBlKHBhcmFtZXRlclR5cGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIENsYXNzPD8+Li4uIHBhcmFtZXRlckphdmFDbGFzc2VzKSB7Ci0JCXRoaXMobmFtZSwgYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVySmF2YUNsYXNzZXMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBidWlsZFBhcmFtZXRlclR5cGVOYW1lcyhDbGFzczw/PltdIHBhcmFtZXRlckphdmFDbGFzc2VzKSB7Ci0JCWlmIChwYXJhbWV0ZXJKYXZhQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIEphdmEgY2xhc3NlcyBhcmUgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlckphdmFDbGFzc2VzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVySmF2YUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXJhbWV0ZXJKYXZhQ2xhc3Nlc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgSmF2YSBjbGFzczogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSBwYXJhbWV0ZXJKYXZhQ2xhc3Nlc1tpXS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIEphdmEgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoTWV0aG9kIG1ldGhvZCkgewotCQl0aGlzKG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkKLQkJCQkmJiB0aGlzLnBhcmFtZXRlclR5cGVzRGVzY3JpYmUobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwYXJhbWV0ZXJUeXBlc0Rlc2NyaWJlKENsYXNzPD8+W10gb3RoZXJQYXJhbWV0ZXJUeXBlcykgewotCQlKYXZhVHlwZVtdIGxvY2FsUGFyYW1ldGVyVHlwZXMgPSB0aGlzLnBhcmFtZXRlclR5cGVzOwotCQlpbnQgbGVuID0gbG9jYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWlmIChvdGhlclBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBsZW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBsb2NhbFBhcmFtZXRlclR5cGVzW2ldLmRlc2NyaWJlcyhvdGhlclBhcmFtZXRlclR5cGVzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyTmFtZSwgSmF2YVR5cGVbXSBvdGhlclBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuZXF1YWxzKG90aGVyTmFtZSkKLQkJCQkmJiBBcnJheXMuZXF1YWxzKHRoaXMucGFyYW1ldGVyVHlwZXMsIG90aGVyUGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhNZXRob2RTaWduYXR1cmUgb3RoZXIpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKG90aGVyLmdldE5hbWUoKSwgb3RoZXIuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAodGhpcyA9PSBvKSA/IHRydWUgOiAobyBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkgPyB0aGlzLmVxdWFscygoTWV0aG9kU2lnbmF0dXJlKSBvKSA6IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuaGFzaENvZGUoKSBeIEFycmF5cy5oYXNoQ29kZSh0aGlzLnBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbnRpbmcgYW5kIGRpc3BsYXlpbmcgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQl0aGlzLmFwcGVuZFNpZ25hdHVyZVRvKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kU2lnbmF0dXJlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCUphdmFUeXBlW10gbG9jYWxQYXJhbWV0ZXJUeXBlcyA9IHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JCWludCBsZW4gPSBsb2NhbFBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXNiLmFwcGVuZChQQVJBTUVURVJfU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWxvY2FsUGFyYW1ldGVyVHlwZXNbaV0uYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRTaWduYXR1cmVPbihQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCh0aGlzLm5hbWUpOwotCQlwdy5wcmludCgnKCcpOwotCQlKYXZhVHlwZVtdIGxvY2FsUGFyYW1ldGVyVHlwZXMgPSB0aGlzLnBhcmFtZXRlclR5cGVzOwotCQlpbnQgbGVuID0gbG9jYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChpICE9IDApIHsKLQkJCQlwdy5wcmludChQQVJBTUVURVJfU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWxvY2FsUGFyYW1ldGVyVHlwZXNbaV0ucHJpbnREZWNsYXJhdGlvbk9uKHB3KTsKLQkJfQotCQlwdy5wcmludCgnKScpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZFNpZ25hdHVyZVRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVRdWV1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTczZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUXVldWV9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVF1ZXVlPEU+Ci0JaW1wbGVtZW50cyBRdWV1ZTxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIExpbmtlZExpc3Q8RT4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHF1ZXVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVRdWV1ZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcXVldWUgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBxdWV1ZSB3aWxsIGRlcXVldWUgaXRzIGVsZW1lbnRzIGluIHRoZSBzYW1lCi0JICogb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgYnkgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvciAoaS5lLiB0aGUKLQkgKiBmaXJzdCBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3Igd2lsbCBiZSB0aGUKLQkgKiBmaXJzdCBlbGVtZW50IHJldHVybmVkIGJ5IHtAbGluayAjZGVxdWV1ZSgpfSkuCi0JICovCi0JcHVibGljIFNpbXBsZVF1ZXVlKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KGMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBRdWV1ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgbykgewotCQl0aGlzLmVsZW1lbnRzLmFkZExhc3Qobyk7Ci0JfQotCi0JcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMucmVtb3ZlRmlyc3QoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5nZXRGaXJzdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmlzRW1wdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2xvbmVhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVRdWV1ZTxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJU2ltcGxlUXVldWU8RT4gY2xvbmUgPSAoU2ltcGxlUXVldWU8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpbmtlZExpc3Q8RT4gbGwgPSAoTGlua2VkTGlzdDxFPikgdGhpcy5lbGVtZW50cy5jbG9uZSgpOwotCQkJY2xvbmUuZWxlbWVudHMgPSBsbDsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnBlZWsoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmRlYTBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTdGFja30gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RhY2s8RT4KLQlpbXBsZW1lbnRzIFN0YWNrPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgTGlua2VkTGlzdDxFPiBlbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgc3RhY2suCi0JICovCi0JcHVibGljIFNpbXBsZVN0YWNrKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8RT4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGFjayBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkCi0JICogY29sbGVjdGlvbi4gVGhlIHN0YWNrIHdpbGwgcG9wIGl0cyBlbGVtZW50cyBpbiByZXZlcnNlIG9mIHRoZQotCSAqIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IgKGkuZS4gdGhlCi0JICogbGFzdCBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3Igd2lsbCBiZSB0aGUKLQkgKiBmaXJzdCBlbGVtZW50IHJldHVybmVkIGJ5IHtAbGluayAjcG9wKCl9KS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RhY2soQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8RT4oY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YWNrIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHB1c2goRSBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudHMuYWRkTGFzdChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgRSBwb3AoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5yZW1vdmVMYXN0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0TGFzdCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMuaXNFbXB0eSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVTdGFjazxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJU2ltcGxlU3RhY2s8RT4gY2xvbmUgPSAoU2ltcGxlU3RhY2s8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpbmtlZExpc3Q8RT4gbGwgPSAoTGlua2VkTGlzdDxFPikgdGhpcy5lbGVtZW50cy5jbG9uZSgpOwotCQkJY2xvbmUuZWxlbWVudHMgPSBsbDsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnBlZWsoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MjM4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci0KLS8vIFRPRE8gdGhlIHJlZ2V4IGNvZGUgaXMgbm90IHZlcnkgZmFzdCAtIHdlIGNvdWxkIHByb2JhYmx5IGRvIGJldHRlciwKLS8vIGhhbmQtY29kaW5nIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gKGVjbGlwc2UgU3RyaW5nTWF0Y2hlcj8pCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBzdHJpbmctbWF0Y2hpbmcgYWxnb3JpdGhtIHRoYXQgaXMgYSBsaXR0bGUKLSAqIG1vcmUgdXNlci1mcmllbmRseSB0aGFuIHN0YW5kYXJkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIEluc3RhbnRpYXRlIGEKLSAqIHN0cmluZyBtYXRjaGVyIHdpdGggYSBmaWx0ZXIgcGF0dGVybiBhbmQgdGhlbiB5b3UgY2FuIHVzZSB0aGUgbWF0Y2hlcgotICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5vdGhlciBzdHJpbmcgKG9yIG9iamVjdCkgbWF0Y2hlcyB0aGUgcGF0dGVybi4KLSAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoZXRoZXIgdGhlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlLXNlbnNpdGl2ZS4KLSAqIAotICogVGhlIHBhdHRlcm4gY2FuIGNvbnRhaW4gdHdvICJtZXRhLWNoYXJhY3RlcnMiOgotICogCScqJyB3aWxsIG1hdGNoIGFueSBzZXQgb2YgemVybyBvciBtb3JlIGNoYXJhY3RlcnMKLSAqIAknPycgd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlcgotICogCi0gKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSAjcHJlZml4KCkgYW5kL29yICNzdWZmaXgoKSB0byBjaGFuZ2Ugd2hhdAotICogc3RyaW5ncyBhcmUgcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHN0cmluZy4KLSAqIFRoaXMgY2FuIG9mZmVyIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG92ZXIgY29uY2F0ZW5hdGluZwotICogc3RyaW5ncyBiZWZvcmUgY2FsbGluZyAjc2V0UGF0dGVyblN0cmluZyhTdHJpbmcpLgotICogQnkgZGVmYXVsdCwgYSAnKicgaXMgYXBwZW5kZWQgdG8gZXZlcnkgc3RyaW5nLgotICogCi0gKiBUaGlzIGNsYXNzIGFsc28gdXNlcyB0aGUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSB0byAiZmlsdGVyIiBvYmplY3RzCi0gKiAoYW5kLCBhcyBhIHJlc3VsdCwgYWxzbyBpbXBsZW1lbnRzIHRoZSBGaWx0ZXIgaW50ZXJmYWNlKS4KLSAqIEEgc3RyaW5nIGNvbnZlcnRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHN0cmluZyBhc3BlY3Qgb2YgdGhlCi0gKiBvYmplY3QgaXMgY29tcGFyZWQgdG8gdGhlIHBhdHRlcm4uIEJ5IGRlZmF1bHQgdGhlIHN0cmluZyByZXR1cm5lZAotICogYnkgdGhlIG9iamVjdCdzICN0b1N0cmluZygpIG1ldGhvZCBpcyBwYXNzZWQgdG8gdGhlIHBhdHRlcm4gbWF0Y2hlci4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cmluZ01hdGNoZXI8VD4KLQlpbXBsZW1lbnRzIFN0cmluZ01hdGNoZXIsIEZpbHRlcjxUPiwgU2VyaWFsaXphYmxlCi17Ci0KLQkvKiogQW4gYWRhcHRlciB0aGF0IGNvbnZlcnRzIHRoZSBvYmplY3RzIGludG8gc3RyaW5ncyB0byBiZSBtYXRjaGVkIHdpdGggdGhlIHBhdHRlcm4uICovCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyOwotCi0JLyoqIFRoZSBzdHJpbmcgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLiAqLwotCXByaXZhdGUgU3RyaW5nIHBhdHRlcm5TdHJpbmc7Ci0KLQkvKiogV2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UgLSB0aGUgZGVmYXVsdCBpcyB0cnVlLiAqLwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVzQ2FzZTsKLQotCS8qKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gYnVpbHQgZnJvbSB0aGUgcGF0dGVybiBzdHJpbmcuICovCi0JcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm47Ci0KLQkvKiogQSBsaXN0IG9mIHRoZSBtZXRhLWNoYXJhY3RlcnMgd2UgbmVlZCB0byBlc2NhcGUgaWYgZm91bmQgaW4gdGhlIHBhdHRlcm4gc3RyaW5nLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFJFR19FWF9NRVRBX0NIQVJTID0geyAnKCcsICdbJywgJ3snLCAnXFwnLCAnXicsICckJywgJ3wnLCAnKScsICc/JywgJyonLCAnKycsICcuJyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0cmluZyBtYXRjaGVyIHdpdGggYW4gcGF0dGVybiB0aGF0IHdpbGwgbWF0Y2gKLQkgKiBhbnkgc3RyaW5nIGFuZCBpZ25vcmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RyaW5nTWF0Y2hlcigpIHsKLQkJdGhpcygiKiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4KLQkgKiB0aGF0IHdpbGwgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm5TdHJpbmcpIHsKLQkJdGhpcyhwYXR0ZXJuU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB0aGF0IHdpbGwKLQkgKiBpZ25vcmUgY2FzZSBhcyBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGJvb2xlYW4gaWdub3Jlc0Nhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZzsKLQkJdGhpcy5pZ25vcmVzQ2FzZSA9IGlnbm9yZXNDYXNlOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIGN1cnJlbnQgcGF0dGVybiBzdHJpbmcgYW5kIGNhc2Utc2Vuc2l0aXZpdHkgc2V0dGluZywKLQkgKiByZS1idWlsZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRQYXR0ZXJuKCkgewotCQl0aGlzLnBhdHRlcm4gPSB0aGlzLmJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBjdXJyZW50IHBhdHRlcm4gc3RyaW5nIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHNldHRpbmcsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRoYXQgY2FuIGJlIHVzZWQKLQkgKiB0byBtYXRjaCBzdHJpbmdzLgotCSAqLwotCXByb3RlY3RlZCBQYXR0ZXJuIGJ1aWxkUGF0dGVybigpIHsKLQkJaW50IHBhdHRlcm5GbGFncyA9IDB4MDsKLQkJaWYgKHRoaXMuaWdub3Jlc0Nhc2UpIHsKLQkJCXBhdHRlcm5GbGFncyA9IFBhdHRlcm4uVU5JQ09ERV9DQVNFIHwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFOwotCQl9Ci0JCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUodGhpcy5jb252ZXJ0VG9SZWdFeCh0aGlzLnBhdHRlcm5TdHJpbmcpLCBwYXR0ZXJuRmxhZ3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdHJpbmdNYXRjaGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCXRoaXMucGF0dGVyblN0cmluZyA9IHBhdHRlcm5TdHJpbmc7Ci0JCXRoaXMucmVidWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVybi5tYXRjaGVyKHN0cmluZykubWF0Y2hlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBGaWx0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdChUIG8pIHsKLQkJcmV0dXJuIHRoaXMubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcobykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cwotCSAqIHBhc3NlZCB0byB0aGUgbWF0Y2hlciBpbnRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdHJpbmcgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cwotCSAqIHBhc3NlZCB0byB0aGUgbWF0Y2hlciBpbnRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgcGF0dGVyblN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVyblN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlnbm9yZXNDYXNlKCkgewotCQlyZXR1cm4gdGhpcy5pZ25vcmVzQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElnbm9yZXNDYXNlKGJvb2xlYW4gaWdub3Jlc0Nhc2UpIHsKLQkJdGhpcy5pZ25vcmVzQ2FzZSA9IGlnbm9yZXNDYXNlOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFBhdHRlcm4gcGF0dGVybigpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVybjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3RoZXIgcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvCi0JICogdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHJlZ3VsYXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9SZWdFeCh0aGlzLnBhdHRlcm5TdHJpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9SZWdFeChTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nLmxlbmd0aCgpICsgMTApOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24odGhpcy5wcmVmaXgoKSwgc2IpOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24oc3RyaW5nLCBzYik7Ci0JCXRoaXMuY29udmVydFRvUmVnRXhPbih0aGlzLnN1ZmZpeCgpLCBzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZCB0byB0aGUgb3JpZ2luYWwKLQkgKiBzdHJpbmcuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vIHByZWZpeC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFueSBzdWZmaXggdGhhdCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIG9yaWdpbmFsCi0JICogc3RyaW5nLiBTaW5jZSB0aGlzIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGluIFVJIHNpdHVhdGlvbiB3aGVyZQotCSAqIHRoZSB1c2VyIGlzIHR5cGluZyBpbiBhIHBhdHRlcm4gdXNlZCB0byBmaWx0ZXIgYSBsaXN0LCB0aGUgZGVmYXVsdAotCSAqIHN1ZmZpeCBpcyBhIHdpbGRjYXJkIGNoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1ZmZpeCgpIHsKLQkJcmV0dXJuICIqIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udmVydFRvUmVnRXhPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhcltdIGNoYXJBcnJheSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgbGVuZ3RoID0gY2hhckFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hhciBjID0gY2hhckFycmF5W2ldOwotCQkJLy8gY29udmVydCB1c2VyLWZyaWVuZGx5IG1ldGEtY2hhcnMgaW50byByZWdleCBtZXRhLWNoYXJzCi0JCQlpZiAoYyA9PSAnKicpIHsKLQkJCQlzYi5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjID09ICc/JykgewotCQkJCXNiLmFwcGVuZCgnLicpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gZXNjYXBlIHJlZ2V4IG1ldGEtY2hhcnMKLQkJCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKFJFR19FWF9NRVRBX0NIQVJTLCBjKSkgewotCQkJCXNiLmFwcGVuZCgnXFwnKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiYTE5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNsYXNzaWMgc3RhY2sgYmVoYXZpb3IsCi0gKiB3aXRob3V0IHRoZSBiYWNrZG9vcnMgYWxsb3dlZCBieSB7QGxpbmsgamF2YS51dGlsLlN0YWNrfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHN0YWNrCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhY2s8RT4gewotCi0JLyoqCi0JICogIlB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQl2b2lkIHB1c2goRSBlbGVtZW50KTsKLQotCS8qKgotCSAqICJQb3AiIGFuIGl0ZW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlFIHBvcCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBzdGFjay4KLQkgKi8KLQlFIHBlZWsoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdGFjayBpcyBlbXB0eS4KLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCi0JZmluYWwgY2xhc3MgRW1wdHk8RT4gaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RhY2sgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IFN0YWNrPFQ+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBvcCgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcGVlaygpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZmQzN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIHRvIGNvbnRyb2wgaG93IGEgY29tbWFuZCBpcyBleGVjdXRlZC4KLSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHNlcnZlciBwcm92aWRlcyB0aGUgY29tbWFuZCBidXQgdGhlIGNsaWVudCBwcm92aWRlcwotICogdGhlIGNvbnRleHQgKGUuZy4gdGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIGRpc3BhdGNoIHRoZSBjb21tYW5kIHRvIHRoZSBVSQotICogdGhyZWFkKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JLyoqCi0JICogU3RhcnQgdGhlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICovCi0Jdm9pZCBzdGFydCgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgY29tbWFuZCBleGVjdXRvci4KLQkgKi8KLQl2b2lkIHN0b3AoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NThmNDljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ0NvbnZlcnRlcjxUPiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBzdHJpbmcuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSByZXN1bHQKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBTdHJpbmdDb252ZXJ0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ0NvbnZlcnRlci5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxMjkwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBzaW1wbGUgQVBJIGZvciBhbGxvd2luZyAicGx1Z2dhYmxlIgotICogc3RyaW5nIG1hdGNoZXJzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIHBhdHRlcm4gc3RyaW5nCi0gKiB0aGVuIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgc3RyaW5ncyBtYXRjaCB0aGUgcGF0dGVybi4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdHJpbmdNYXRjaGVyIHsKLQotCS8qKgotCSAqIFNldCB0aGUgcGF0dGVybiBzdHJpbmcgdXNlZCB0byBkZXRlcm1pbmUgZnV0dXJlCi0JICogbWF0Y2hlcy4gVGhlIGZvcm1hdCBhbmQgc2VtYW50aWNzIG9mIHRoZSBwYXR0ZXJuCi0JICogc3RyaW5nIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZQotCSAqIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQl2b2lkIHNldFBhdHRlcm5TdHJpbmcoU3RyaW5nIHBhdHRlcm5TdHJpbmcpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUKLQkgKiBlc3RhYmxpc2hlZCBwYXR0ZXJuIHN0cmluZy4gVGhlIHNlbWFudGljcyBvZiBhIG1hdGNoCi0JICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUKLQkgKiBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU3RyaW5nTWF0Y2hlciwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdNYXRjaGVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmdNYXRjaGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCQkvLyBpZ25vcmUgdGhlIHBhdHRlcm4gc3RyaW5nCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQkvLyBldmVyeXRoaW5nIGlzIGEgbWF0Y2gKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdNYXRjaGVyLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiOTlkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzLgotICogCi0gKiBBcyBvZiBqZGsgMS41LCBpdCdzIHRlbXB0aW5nIHRvIGNvbnZlcnQgYWxsIG9mIHRoZXNlIG1ldGhvZHMgdG8gdXNlCi0gKiBqYXZhLmxhbmcuQXBwZW5kYWJsZSAoaW5zdGVhZCBvZiBTdHJpbmdCdWZmZXIsIFN0cmluZ0J1aWxkZXIsIGFuZCBXcml0ZXIpOwotICogYnV0IGFsbCB0aGUgQXBwZW5kYWJsZSBtZXRob2RzIHRocm93IGphdmEuaW8uSU9FeGNlcHRpb24gKHllY2gpIGFuZCB3ZQotICogW21pZ2h0P10gZ2V0IGEgYml0IGJldHRlciBwZXJmb3JtYW5jZSBpbnZva2luZyBtZXRob2RzIG9uIGNsYXNzZXMgdGhhbgotICogd2UgZ2V0IG9uIGludGVyZmFjZXMuIDotKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVG9vbHMgewotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqIGRvdWJsZSBxdW90ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKLQotCS8qKiBwYXJlbnRoZXNpcyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX1BBUkVOVEhFU0lTID0gJygnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9QQVJFTlRIRVNJUyA9ICcpJzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0JSQUNLRVQgPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX0JSQUNLRVQgPSAnXSc7Ci0KLQkvKiogYnJhY2tldHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BFTl9CUkFDRSA9ICd7JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfQlJBQ0UgPSAnfSc7Ci0KLQkvKiogYnJhY2tldHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BFTl9DSEVWUk9OID0gJzwnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9DSEVWUk9OID0gJz4nOwotCi0JLyoqIGVtcHR5IHN0cmluZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogZW1wdHkgY2hhciBhcnJheSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0NIQVJfQVJSQVkgPSBuZXcgY2hhclswXTsKLQotCi0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIHdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBwYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsZW5ndGgsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYWRfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhwYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhpbnQgc3RyaW5nTGVuZ3RoLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChBcnJheVRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHBhZF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgc3RyaW5nTGVuZ3RoKTsKLQkJQXJyYXlzLmZpbGwocmVzdWx0LCBzdHJpbmdMZW5ndGgsIGxlbmd0aCwgYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gemVyb1BhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHplcm9QYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHplcm9QYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlIAotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlIAotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogRnJvbnQtcGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZyb250UGFkXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZnJvbnRQYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFplcm8tcGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGZyb250UGFkXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpbnQgcGFkTGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCBwYWRMZW5ndGgsIHN0cmluZ0xlbmd0aCk7Ci0JCUFycmF5cy5maWxsKHJlc3VsdCwgMCwgcGFkTGVuZ3RoLCBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZy9xdW90aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGUoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBkZWxpbWl0KHN0cmluZ3MsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaW1pdChTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFN0cmluZyhkZWxpbWl0KHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgV3JpdGVyIHdyaXRlcikgewotCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlciwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncywgZmluYWwgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaW1pdChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJcmV0dXJuIGRlbGltaXQoc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApKTsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhkZWxpbWl0KHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlci5jaGFyQXQoMCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGRlbGltaXQoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBmaW5hbCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJcmV0dXJuIGRlbGltaXQoc3RyaW5ncywgZGVsaW1pdGVyLmNoYXJBdCgwKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBxdW90ZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBkZWxpbWl0KHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ3F1b3RlJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBxdW90ZUNoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBkZWxpbWl0Q2hhckFycmF5cyhzdHJpbmdzLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGRlbGltaXQoY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGggKyAyKTsKLQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKGRlbGltaXRlciwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGRlbGltaXRlciwgd3JpdGVyKTsKLQkJd3JpdGVDaGFyT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MsIGZpbmFsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCBkZWxpbWl0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGRlbGltaXQoY2hhcltdIHN0cmluZywgY2hhcltdIGRlbGltaXRlcikgewotCQlpbnQgZGVsaW1pdGVyTGVuZ3RoID0gZGVsaW1pdGVyLmxlbmd0aDsKLQkJaWYgKGRlbGltaXRlckxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlclswXSk7Ci0JCX0KLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzdHJpbmdMZW5ndGgrKDIqZGVsaW1pdGVyTGVuZ3RoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGVsaW1pdGVyLCAwLCByZXN1bHQsIDAsIGRlbGltaXRlckxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIGRlbGltaXRlckxlbmd0aCwgc3RyaW5nTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShkZWxpbWl0ZXIsIDAsIHJlc3VsdCwgc3RyaW5nTGVuZ3RoK2RlbGltaXRlckxlbmd0aCwgZGVsaW1pdGVyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJd3JpdGVTdHJpbmdPbihkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBmaW5hbCBjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCBkZWxpbWl0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcXVvdGVkOiAiXCJmb29cIiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUXVvdGVkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHBhcmVudGhldGljYWw6ICIoZm9vKSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fUEFSRU5USEVTSVMsIENMT1NFX1BBUkVOVEhFU0lTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFja2V0ZWQ6ICJbZm9vXSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDS0VULCBDTE9TRV9CUkFDS0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFjZWQ6ICJ7Zm9vfSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2VkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDRSwgQ0xPU0VfQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGNoZXZyb25lZDogIjxmb28+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0NIRVZST04sIENMT1NFX0NIRVZST04pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgYywgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChTdHJpbmcgc3RyaW5nLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuIDwgMikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBxdW90ZWQ6ICJcImZvb1wiIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNRdW90ZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcGFyZW50aGV0aWNhbDogIihmb28pIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNQYXJlbnRoZXRpY2FsKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9QQVJFTlRIRVNJUywgQ0xPU0VfUEFSRU5USEVTSVMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNrZXRlZDogIltmb29dIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFja2V0ZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNLRVQsIENMT1NFX0JSQUNLRVQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNlZDogIntmb299Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFjZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNFLCBDTE9TRV9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgY2hldnJvbmVkOiAiPGZvbz4iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0NoZXZyb25lZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQ0hFVlJPTiwgQ0xPU0VfQ0hFVlJPTik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBjLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKGNoYXJbXSBzdHJpbmcsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuIDwgMikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIHN0YXJ0LCBlbmQsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChjaGFyW10gcywgY2hhciBzdGFydCwgY2hhciBlbmQsIGludCBsZW4pIHsKLQkJcmV0dXJuIChzWzBdID09IHN0YXJ0KSAmJiAoc1tsZW4gLSAxXSA9PSBlbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bmRlbGltaXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5kZWxpbWl0KFN0cmluZyBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyh1bmRlbGltaXRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5kZWxpbWl0KFN0cmluZyBzdHJpbmcsIGludCBjb3VudCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyh1bmRlbGltaXQoc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgY291bnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmRlbGltaXQoY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJcmV0dXJuIHVuZGVsaW1pdF8oc3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB1bmRlbGltaXRfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHVuZGVsaW1pdChjaGFyW10gc3RyaW5nLCBpbnQgY291bnQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQlyZXR1cm4gdW5kZWxpbWl0KHN0cmluZywgbGVuLCBjb3VudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHVuZGVsaW1pdChjaGFyW10gc3RyaW5nLCBpbnQgbGVuLCBpbnQgY291bnQpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBjb3VudCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXVuZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGNvdW50LCBsZW4sIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQl1bmRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgY291bnQgKyBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXVuZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgY291bnQgKyBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdW5kZWxpbWl0T25fKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdHJpbmcgaXMgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgZGVsaW1pdGVyID0gc3RyaW5nWzBdOyAgLy8gdGhlIGZpcnN0IGNoYXIgaXMgdGhlIGRlbGltaXRlcgotCQljaGFyIGMgPSBzdHJpbmdbMF07Ci0JCWNoYXIgbmV4dCA9IHN0cmluZ1sxXTsKLQkJaW50IGkgPSAxOwotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlkbyB7Ci0JCQljID0gbmV4dDsKLQkJCXdyaXRlQ2hhck9uKGMsIHdyaXRlcik7Ci0JCQlpKys7Ci0JCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKChuZXh0ICE9IGRlbGltaXRlcikgfHwgKGkgPT0gbGFzdCkpIHsKLQkJCQkJLy8gYW4gZW1iZWRkZWQgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZWxpbWl0ZXIKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpKys7Ci0JCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCX0KLQkJfSB3aGlsZSAoaSAhPSBsYXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgY291bnQsIGxlbiwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdW5kZWxpbWl0T25fKHN0cmluZywgc2IpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHN0cmluZyBpcyBhdCBsZWFzdCAzIGNoYXJhY3RlcnMgbG9uZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kZWxpbWl0T25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIGRlbGltaXRlciA9IHN0cmluZ1swXTsgIC8vIHRoZSBmaXJzdCBjaGFyIGlzIHRoZSBkZWxpbWl0ZXIKLQkJY2hhciBjID0gc3RyaW5nWzBdOwotCQljaGFyIG5leHQgPSBzdHJpbmdbMV07Ci0JCWludCBpID0gMTsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJZG8gewotCQkJYyA9IG5leHQ7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCQlpKys7Ci0JCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKChuZXh0ICE9IGRlbGltaXRlcikgfHwgKGkgPT0gbGFzdCkpIHsKLQkJCQkJLy8gYW4gZW1iZWRkZWQgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZWxpbWl0ZXIKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpKys7Ci0JCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCX0KLQkJfSB3aGlsZSAoaSAhPSBsYXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdW5kZWxpbWl0T25fKHN0cmluZywgc2IpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHN0cmluZyBpcyBhdCBsZWFzdCAzIGNoYXJhY3RlcnMgbG9uZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kZWxpbWl0T25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBkZWxpbWl0ZXIgPSBzdHJpbmdbMF07ICAvLyB0aGUgZmlyc3QgY2hhciBpcyB0aGUgZGVsaW1pdGVyCi0JCWNoYXIgYyA9IHN0cmluZ1swXTsKLQkJY2hhciBuZXh0ID0gc3RyaW5nWzFdOwotCQlpbnQgaSA9IDE7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWRvIHsKLQkJCWMgPSBuZXh0OwotCQkJc2IuYXBwZW5kKGMpOwotCQkJaSsrOwotCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCWlmICgobmV4dCAhPSBkZWxpbWl0ZXIpIHx8IChpID09IGxhc3QpKSB7Ci0JCQkJCS8vIGFuIGVtYmVkZGVkIGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVsaW1pdGVyCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQl9Ci0JCX0gd2hpbGUgKGkgIT0gbGFzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGxlbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92aW5nIGNoYXJhY3RlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEpOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGFzdCk7Ci0JCX0KLQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpLmNvbmNhdChzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsYXN0XTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMSwgcmVzdWx0LCAwLCBsYXN0KTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGxhc3QpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBpbmRleCArIDEsIHJlc3VsdCwgaW5kZXgsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hhckF0SW5kZXhPbihjaGFyW10gc3RyaW5nLCBpbnQgaW5kZXgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgbGFzdCwgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsYXN0LCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBpbmRleCwgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZywgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hhckF0SW5kZXhPbihjaGFyW10gc3RyaW5nLCBpbnQgaW5kZXgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBpbmRleCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcsIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoYXJBdEluZGV4T24oY2hhcltdIHN0cmluZywgaW50IGluZGV4LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMSwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBpbmRleCk7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsT2NjdXJyZW5jZXMoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IG5ldyBTdHJpbmcocmVtb3ZlQWxsT2NjdXJyZW5jZXNfKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcsIGMsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXNfKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXdyaXRlQ2hhck9uKGQsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoZCAhPSBjKSB7Ci0JCQkJc2IuYXBwZW5kKGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQlzYi5hcHBlbmQoZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU3BhY2VzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxTcGFjZXMoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFdoaXRlc3BhY2UoU3RyaW5nIHN0cmluZykgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhyZW1vdmVBbGxXaGl0ZXNwYWNlXyhzdHJpbmcyLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogcmVtb3ZlQWxsV2hpdGVzcGFjZV8oc3RyaW5nLCBmaXJzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGgpOwotCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBmaXJzdCwgd3JpdGVyKTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXdyaXRlQ2hhck9uKGMsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXByZXNzV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKGNvbXByZXNzV2hpdGVzcGFjZV8oc3RyaW5nMiwgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogU3RyaW5nI2NvbXByZXNzV2hpdGVzcGFjZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UgaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogU3RyaW5nI2NvbXByZXNzV2hpdGVzcGFjZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29tcHJlc3NXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogY29tcHJlc3NXaGl0ZXNwYWNlXyhzdHJpbmcsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb21wcmVzc1doaXRlc3BhY2VfKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyaW5nLmxlbmd0aCk7Ci0JCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWJvb2xlYW4gc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoc3BhY2VXcml0dGVuKSB7Ci0JCQkJCS8vIHNraXAgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXBsYWNlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHdpdGggYSBzcGFjZQotCQkJCQlzcGFjZVdyaXR0ZW4gPSB0cnVlOwotCQkJCQl3cml0ZUNoYXJPbignICcsIHdyaXRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWJvb2xlYW4gc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoc3BhY2VXcml0dGVuKSB7Ci0JCQkJCS8vIHNraXAgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXBsYWNlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHdpdGggYSBzcGFjZQotCQkJCQlzcGFjZVdyaXR0ZW4gPSB0cnVlOwotCQkJCQlzYi5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJYm9vbGVhbiBzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCWlmIChzcGFjZVdyaXR0ZW4pIHsKLQkJCQkJLy8gc2tpcCBzdWJzZXF1ZW50IHdoaXRlc3BhY2UgY2hhcmFjdGVycwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlcGxhY2UgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlCi0JCQkJCXNwYWNlV3JpdHRlbiA9IHRydWU7Ci0JCQkJCXNiLmFwcGVuZCgnICcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKiBTdHJpbmcjY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aChzMS50b0NoYXJBcnJheSgpLCBzMi50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoXyhzMSwgczIsIE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uCi0JICogU3RyaW5nI2NvbW1vblByZWZpeExlbmd0aChTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIsIGludCBtYXgpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aChzMS50b0NoYXJBcnJheSgpLCBzMi50b0NoYXJBcnJheSgpLCBtYXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChjaGFyW10gczEsIGNoYXJbXSBzMiwgaW50IG1heCkgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoXyhzMSwgczIsIE1hdGgubWluKG1heCwgTWF0aC5taW4oczEubGVuZ3RoLCBzMi5sZW5ndGgpKSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4gQXNzdW1lIHRoZSBzcGVjaWZpZWQKLQkgKiBtYXhpbXVtIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RocyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aF8oY2hhcltdIHMxLCBjaGFyW10gczIsIGludCBtYXgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJaWYgKHMxW2ldICE9IHMyW2ldKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHVwIHRvICdtYXgnIGFyZSB0aGUgc2FtZQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYXBpdGFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY2FwaXRhbGl6ZV8oY2hhcltdIHN0cmluZykgewotCQlzdHJpbmdbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoCi0JICogaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjYXBpdGFsaXplKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcubGVuZ3RoID09IDApIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBjYXBpdGFsaXplXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogU3RyaW5nI2NhcGl0YWxpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY2FwaXRhbGl6ZV8oc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mCi0JICogZWFjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2FwaXRhbGl6ZShJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YKLQkgKiBlYWNoLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2NhcGl0YWxpemUnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IGNhcGl0YWxpemVDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW5jYXBpdGFsaXplXyhjaGFyW10gc3RyaW5nKSB7Ci0JCXN0cmluZ1swXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGggPiAxKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMV0pCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggaXRzCi0JICogZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHVuY2FwaXRhbGl6ZShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiB1bmNhcGl0YWxpemVfKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gaWYgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBjaGFyYWN0ZXJzIGFyZSBjYXBpdGFsaXplZCwKLQkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkCi0JCWlmICgoc3RyaW5nLmxlbmd0aCgpID4gMSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgxKSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5jYXBpdGFsaXplKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5jYXBpdGFsaXplXyhzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSksIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemVPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqICN0b1N0cmluZygpIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGEgInN0YW5kYXJkIiAjdG9TdHJpbmcoKSByZXN1bHQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0JICogCUNsYXNzTmFtZVswMEYzRUU0Ml0gKGFkZCdsIGluZm8pCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0ZvcihPYmplY3QgbywgT2JqZWN0IGFkZGl0aW9uYWxJbmZvKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZFNpbXBsZVRvU3RyaW5nT24obywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgInN0YW5kYXJkIiBzaW1wbGUgI3RvU3RyaW5nKCkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdDoKLQkgKiAJQ2xhc3NOYW1lWzAwRjNFRTQyXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9TdHJpbmdGb3IoT2JqZWN0IG8pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJ1aWxkU2ltcGxlVG9TdHJpbmdPbihvLCBzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhICJzdGFuZGFyZCIgc2ltcGxlICN0b1N0cmluZygpIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCB0bwotCSAqIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcjoKLQkgKiAJQ2xhc3NOYW1lWzAwRjNFRTQyXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFNpbXBsZVRvU3RyaW5nT24oT2JqZWN0IG8sIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy50b1N0cmluZ0NsYXNzTmFtZUZvck9iamVjdChvKSk7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQkvLyB1c2UgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KSwgc2luY2UgT2JqZWN0I2hhc2hDb2RlKCkgbWF5IGJlIG92ZXJyaWRkZW4KLQkJc2IuYXBwZW5kKHplcm9QYWQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKSkudG9VcHBlckNhc2UoKSwgOCkpOwotCQlzYi5hcHBlbmQoJ10nKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSAic3RhbmRhcmQiIHNpbXBsZSAjdG9TdHJpbmcoKSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyOgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkU2ltcGxlVG9TdHJpbmdPbihPYmplY3QgbywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy50b1N0cmluZ0NsYXNzTmFtZUZvck9iamVjdChvKSk7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQkvLyB1c2UgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KSwgc2luY2UgT2JqZWN0I2hhc2hDb2RlKCkgbWF5IGJlIG92ZXJyaWRkZW4KLQkJc2IuYXBwZW5kKHplcm9QYWQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKSkudG9VcHBlckNhc2UoKSwgOCkpOwotCQlzYi5hcHBlbmQoJ10nKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIFRbXSBhcnJheSkgewotCQlyZXR1cm4gYXBwZW5kKHNiLCBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8VD4oYXJyYXkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhcHBlbmQoc2IsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBhcHBlbmQoU3RyaW5nQnVpbGRlciBzYiwgSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXNiLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZCgnXScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0VtcHR5XyhzdHJpbmcsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5XyhjaGFyW10gcywgaW50IGxlbikgewotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vbi1udWxsLCBub24tZW1wdHksIGFuZCBkb2VzCi0JICogbm90IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTm90RW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gISBzdHJpbmdJc0VtcHR5KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbm9uLW51bGwsIG5vbi1lbXB0eSwgYW5kIGRvZXMKLQkgKiBub3QgY29udGFpbiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNOb3RFbXB0eShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiAhIHN0cmluZ0lzRW1wdHkoc3RyaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbC4KLQkgKiBDaGVjayBmb3IgbnVsbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbChTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlpZiAoKHMxID09IG51bGwpICYmIChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyBib3RoIGFyZSBudWxsCi0JCX0KLQkJaWYgKChzMSA9PSBudWxsKSB8fCAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJcmV0dXJuIHMxLmVxdWFscyhzMik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwuCi0JICogQ2hlY2sgZm9yIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWwoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJaWYgKChzMSA9PSBudWxsKSAmJiAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgoczEgPT0gbnVsbCkgfHwgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBvbmUgaXMgbnVsbCBidXQgdGhlIG90aGVyIGlzIG5vdAotCQl9Ci0JCWludCBsZW4gPSBzMS5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gczIubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoczFbaV0gIT0gczJbaV0pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQ2hlY2sgZm9yIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmICgoczEgPT0gbnVsbCkgJiYgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlyZXR1cm4gczEuZXF1YWxzSWdub3JlQ2FzZShzMik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQ2hlY2sgZm9yIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCWlmICgoczEgPT0gbnVsbCkgJiYgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlpbnQgbGVuID0gczEubGVuZ3RoOwotCQlpZiAobGVuICE9IHMyLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoczFbaV0sIHMyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwKLQkgKiBpZ25vcmluZyBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZShjaGFyW10gc3RyaW5nLCBjaGFyW10gcHJlZml4KSB7Ci0JCWludCBwcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoOwotCQlpZiAoc3RyaW5nLmxlbmd0aCA8IHByZWZpeExlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBwcmVmaXhMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2Uoc3RyaW5nW2ldLCBwcmVmaXhbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwKLQkgKiBpZ25vcmluZyBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdHJpbmcucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBwcmVmaXgsIDAsIHByZWZpeC5sZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGFyZSBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nI3JlZ2lvbk1hdGNoZXMoYm9vbGVhbiwgaW50LCBTdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQkJLy8gIHNvbWV0aGluZyBhYm91dCB0aGUgR2VvcmdpYW4gYWxwaGFiZXQgcmVxdWlyZXMgdXMgdG8gY2hlY2sgbG93ZXIgY2FzZSBhbHNvCi0JCXJldHVybiAoYzEgPT0gYzIpCi0JCQkJfHwgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMyKSkKLQkJCQl8fCAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyB1cHBlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzVXBwZXJjYXNlXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHVwcGVyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2UoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzVXBwZXJjYXNlXyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2VfKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZy5lcXVhbHMoc3RyaW5nLnRvVXBwZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGxvd2VyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGgoKSA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNMb3dlcmNhc2VfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbG93ZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNMb3dlcmNhc2VfKG5ldyBTdHJpbmcoc3RyaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZV8oU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nLmVxdWFscyhzdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgY2FtZWwgY2FzZSB0byBhbGwgY2FwcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKiAyKTsKLQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXdyaXRlQ2hhck9uKCdfJywgd3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCkgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG1heExlbmd0aCk7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJaW50IHdyaXRlckxlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJd3JpdGVDaGFyT24oJ18nLCB3cml0ZXIpOwotCQkJCWlmICgrK3dyaXRlckxlbmd0aCA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCWlmICgrK3dyaXRlckxlbmd0aCA9PSBtYXhMZW5ndGgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZXJpZXMgb2YgY2hhcmFjdGVycyBvY2N1ciBhdAotCSAqIGEgImNhbWVsIGNhc2UiIHdvcmsgYnJlYWs6Ci0JICogICAgICIqYWEiIC0+IGZhbHNlCi0JICogICAgICIqQUEiIC0+IGZhbHNlCi0JICogICAgICIqQWEiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJBQUEiIC0+IGZhbHNlCi0JICogICAgICJhYSoiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJhQWEiIC0+IHRydWUKLQkgKiAgICAgIkFBKiIgLT4gZmFsc2UKLQkgKiAgICAgIkFBYSIgLT4gdHJ1ZQotCSAqIHdoZXJlICcqJyA9PSBhbnkgY2hhcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FtZWxDYXNlV29yZEJyZWFrXyhjaGFyIHByZXYsIGNoYXIgYywgY2hhciBuZXh0KSB7Ci0JCWlmIChwcmV2ID09IDApIHsJLy8gc3RhcnQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UocHJldikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChuZXh0ID09IDApIHsJLy8gZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UobmV4dCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gY2FtZWwgY2FzZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSh1bmRlcnNjb3JlU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSh1bmRlcnNjb3JlU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1bmRlcnNjb3JlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVuZGVyc2NvcmVTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7Ci0JCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7Ci0JCWNoYXIgYyA9IDA7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlwcmV2ID0gYzsKLQkJCWMgPSB1bmRlcnNjb3JlU3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gJ18nKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoKHByZXYgPT0gJ18nKSA/IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl3cml0ZUNoYXJPbihjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXdyaXRlQ2hhck9uKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydCB0byBKYXZhIHN0cmluZyBsaXRlcmFsICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwgPSAiXCJcIiI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTF9DSEFSX0FSUkFZID0gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTC50b0NoYXJBcnJheSgpOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiLCBsZW4pOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMX0NIQVJfQVJSQVk7Ci0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDUpOwotCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQlsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzdHJpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2NvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscycgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gY29udmVydFRvSmF2YUNoYXJBcnJheUxpdGVyYWxzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzdHJpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IsIGludCBsZW4pIHsKLQkJc2IuZW5zdXJlQ2FwYWNpdHkoc2IubGVuZ3RoKCkgKyBsZW4gKyA1KTsKLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQlzYi5hcHBlbmQoIlxcYiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQlzYi5hcHBlbmQoIlxcdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJc2IuYXBwZW5kKCJcXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXNiLmFwcGVuZCgiXFxmIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQlzYi5hcHBlbmQoIlxcciIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoIlxcXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQlzYi5hcHBlbmQoIlxcJyIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQlzYi5hcHBlbmQoIlxcXFwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoUVVPVEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZywgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIGxlbmd0aCBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IsIGludCBsZW4pIHsKLQkJc2IuZW5zdXJlQ2FwYWNpdHkoc2IubGVuZ3RoKCkgKyBsZW4gKyA1KTsKLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQlzYi5hcHBlbmQoIlxcYiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQlzYi5hcHBlbmQoIlxcdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJc2IuYXBwZW5kKCJcXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXNiLmFwcGVuZCgiXFxmIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQlzYi5hcHBlbmQoIlxcciIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoIlxcXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQlzYi5hcHBlbmQoIlxcJyIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQlzYi5hcHBlbmQoIlxcXFwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoUVVPVEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl3cml0ZVN0cmluZ09uKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJd3JpdGVTdHJpbmdPbihFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKFFVT1RFLCB3cml0ZXIpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXGInOiAgLy8gYmFja3NwYWNlCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcYiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1x0JzogIC8vIGhvcml6b250YWwgdGFiCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcdCIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJzogIC8vIGxpbmUtZmVlZCBMRgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXG4iLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcZic6ICAvLyBmb3JtLWZlZWQgRkYKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxmIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHInOiAgLy8gY2FycmlhZ2UtcmV0dXJuIENSCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcciIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOiAgLy8gZG91YmxlLXF1b3RlCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcXCIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgJ1wnJzogIC8vIHNpbmdsZS1xdW90ZQotLy8JCQkJCXdyaXRlU3RyaW5nT24oIlxcJyIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXFwnOiAgLy8gYmFja3NsYXNoCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcXFwiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3cml0ZUNoYXJPbihRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvQ2hhckFycmF5KFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvQ2hhckFycmF5KFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihjaGFyW10gc3RyaW5nLCBjaGFyIGVzY2FwZSwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCQlpZiAoYyA9PSBlc2NhcGUpIHsKLQkJCQkJd3JpdGVyLndyaXRlKGMpOwotCQkJCX0KLQkJCQl3cml0ZXIud3JpdGUoYyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgaW50IG9mZiwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZywgb2ZmLCBsZW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKFN0cmluZyBzdHJpbmcsIGludCBvZmYsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcsIG9mZiwgbGVuKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDaGFyT24oY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJhZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTllOGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRocmVhZC1zYWZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCYWc8RT4KLQlpbXBsZW1lbnRzIEJhZzxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgYmFnLiAqLwotCXByaXZhdGUgZmluYWwgQmFnPEU+IGJhZzsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBiYWcgYW5kIGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZyhCYWc8RT4gYmFnLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGJhZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJhZyA9IGJhZzsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgYmFnIGFuZCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZyhCYWc8RT4gYmFnKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChiYWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5iYWcgPSBiYWc7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCYWcoT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobmV3IEhhc2hCYWc8RT4oKSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZygpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFnIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5hZGQobywgY291bnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5jb3VudChvKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvLCBjb3VudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5hZGRBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmJhZy5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnMobyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnNBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5pc0VtcHR5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5yZW1vdmVBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJldGFpbkFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuc2l6ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheShhKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIHB1YmxpYyBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3RhY2sgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTYyYjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiwKLSAqIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICogCi0gKiBAc2VlIEJvb2xlYW5SZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJvb2xlYW4KLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+Ym9vbGVhbjwvY29kZT4uICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogaW5pdGlhbCB2YWx1ZSBhbmQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogYW5kIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhmYWxzZSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCA8Y29kZT5ib29sZWFuPC9jb2RlPgotCSAqIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogVGhlIHN5bmNocm9uaXplZCA8Y29kZT5ib29sZWFuPC9jb2RlPiBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzKGJvb2xlYW4gdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPgotCSAqIHZhbHVlIGlzIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3QoYm9vbGVhbiB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWxzZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gISB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oYm9vbGVhbiB2KSB7Ci0JCWlmICh0aGlzLnZhbHVlICE9IHYpIHsKLQkJCXRoaXMudmFsdWUgPSB2OwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gdGhlIE5PVCBvZiBpdHMgY3VycmVudCB2YWx1ZS4KLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmxpcCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHYgPSAhIHRoaXMudmFsdWU7Ci0JCQl0aGlzLnNldFZhbHVlXyh2KTsKLQkJCXJldHVybiB2OwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90KGJvb2xlYW4gdikgewotCQl0aGlzLnNldFZhbHVlKCAhIHYpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRydWUoKSB7Ci0JCXRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZhbHNlKCkgewotCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGlzIG9iamVjdCBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKGJvb2xlYW4gdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFZhbHVlSXNfKGJvb2xlYW4gdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgIT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFZhbHVlSXNOb3QoYm9vbGVhbiB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXMoICEgdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVHJ1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEZhbHNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcyB0bwotCSAqIDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeQotCSAqIDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkgKiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRWYWx1ZShib29sZWFuIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyggISB2KTsKLQkJCXRoaXMuc2V0VmFsdWVfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT50cnVlPC9jb2RlPiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1NldFRydWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRUb1NldFZhbHVlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRGYWxzZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFRvU2V0VmFsdWUoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzXyhib29sZWFuIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18odik7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgIT0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KGJvb2xlYW4gdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXMoICEgdiwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT50cnVlPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFRydWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKHRydWUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEZhbHNlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGRvZXMgbm90Ci0JICogY2hhbmdlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeQotCSAqIDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkgKiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRWYWx1ZShib29sZWFuIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKCAhIHYsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kCi0JICogY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqIGNoYW5naW5nIHRoZSB2YWx1ZS4gVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+OwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sIHNldCB0aGUKLQkgKiB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRUcnVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kCi0JICogY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0Ci0JICogY2hhbmdpbmcgdGhlIHZhbHVlLiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwgc2V0IHRoZQotCSAqIHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJCXJldHVybiAoU3luY2hyb25pemVkQm9vbGVhbikgc3VwZXIuY2xvbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgU3luY2hyb25pemVkQm9vbGVhbikgJiYKLQkJCSh0aGlzLmdldFZhbHVlKCkgPT0gKChTeW5jaHJvbml6ZWRCb29sZWFuKSBvKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpID8gMSA6IDA7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0VmFsdWUoKSkgKyAnXSc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjkwMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+LgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHZhbHVlIGlzIHNldCB0byBhIHNwZWNpZmllZCB2YWx1ZSwgd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKiAKLSAqIEBzZWUgSW50UmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJbnQKLQlpbXBsZW1lbnRzIENvbXBhcmFibGU8U3luY2hyb25pemVkSW50PiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5pbnQ8L2NvZGU+LiAqLwotCXByaXZhdGUgaW50IHZhbHVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KGludCB2YWx1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBpbnRlZ2VyIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgaW50ZWdlciBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEludChpbnQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgemVybwotCSAqIGFuZCB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQoT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoMCwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIHplcm8uCi0JICogVGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KCkgewotCQl0aGlzKDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbm90RXF1YWxzKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIHplcm8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNaZXJvKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgemVyby4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFplcm8oKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA+IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW5PckVxdWFsKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPj0gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA8IHY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW5PckVxdWFsKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPD0gdjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIHBvc2l0aXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUG9zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW4oMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IHBvc2l0aXZlCi0JICogKGkuZS4gbmVnYXRpdmUgb3IgemVybykuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNMZXNzVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbmVnYXRpdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZWdhdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNMZXNzVGhhbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiAoaS5lLiB6ZXJvIG9yIHBvc2l0aXZlKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE5lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHNldFZhbHVlKGludCB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIDxlbT5vbGQ8L2VtPiB2YWx1ZS4KLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGludCBzZXRWYWx1ZV8oaW50IHYpIHsKLQkJaW50IG9sZCA9IHRoaXMudmFsdWU7Ci0JCWlmICh0aGlzLnZhbHVlICE9IHYpIHsKLQkJCXRoaXMudmFsdWUgPSB2OwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCQlyZXR1cm4gb2xkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPm5ldzwvZW0+IHZhbHVlLgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgaW50IHNldE5ld1ZhbHVlXyhpbnQgdikgewotCQlpZiAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQl0aGlzLnZhbHVlID0gdjsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBhYnMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKE1hdGguYWJzKHRoaXMudmFsdWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIG5lZ2F0aXZlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgbmVnKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldE5ld1ZhbHVlXygtdGhpcy52YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHplcm8uIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0WmVybygpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoMCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBwbHVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBhZGQoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8odGhpcy52YWx1ZSArIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IHRoZSB2YWx1ZSBieSBvbmUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBpbmNyZW1lbnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy52YWx1ZSsrOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBtaW51cyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgc3VidHJhY3QoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8odGhpcy52YWx1ZSAtIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IHRoZSB2YWx1ZSBieSBvbmUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBkZWNyZW1lbnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy52YWx1ZS0tOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSB0aW1lcyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgbXVsdGlwbHkoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8odGhpcy52YWx1ZSAqIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBkaXZpZGUoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8odGhpcy52YWx1ZSAvIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IHZhbHVlIGRpdmlkZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgcmVtYWluZGVyKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0TmV3VmFsdWVfKHRoaXMudmFsdWUgJSB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIG1pbmltdW0gb2YgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBtaW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXROZXdWYWx1ZV8oTWF0aC5taW4odGhpcy52YWx1ZSwgdikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byB0aGUgbWF4aW11bSBvZiB0aGUgY3VycmVudCB2YWx1ZSBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IG1heChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldE5ld1ZhbHVlXyhNYXRoLm1heCh0aGlzLnZhbHVlLCB2KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50IHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlJwotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvdyhpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldE5ld1ZhbHVlXygoaW50KSBNYXRoLnBvdyh0aGlzLnZhbHVlLCB2KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCBzZXQgaXQgdG8gdGhlCi0JICogc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVBbmRTd2FwKGludCBleHBlY3RlZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wYXJlQW5kU3dhcF8oZXhwZWN0ZWRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcGFyZUFuZFN3YXBfKGludCBleHBlY3RlZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IGV4cGVjdGVkVmFsdWUpID8gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpIDogdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3luY2hyb25pemVkIGludGVnZXIgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFcXVhbF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsRXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlCi0JICogdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsTm90RXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA9PSB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIHplcm8uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgemVybywgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gemVyby4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gemVybywKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90WmVybygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsTm90RXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeQotCSAqIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsR3JlYXRlclRoYW4oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbl8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsR3JlYXRlclRoYW5fKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA8PSB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPCB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbExlc3NUaGFuKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5fKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbExlc3NUaGFuXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPj0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlID4gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgcG9zaXRpdmUuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgcG9zaXRpdmUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxQb3NpdGl2ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW4oMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBwb3NpdGl2ZQotCSAqIChpLmUuIG5lZ2F0aXZlIG9yIHplcm8pLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiBwb3NpdGl2ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90UG9zaXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbmVnYXRpdmUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOZWdhdGl2ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsTGVzc1RoYW4oMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBuZWdhdGl2ZQotCSAqIChpLmUuIHplcm8gb3IgcG9zaXRpdmUpLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiBuZWdhdGl2ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90TmVnYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgd2FpdFRvU2V0VmFsdWUoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odik7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8sIHRoZW4gY2hhbmdlIGl0Ci0JICogYmFjayB0byB6ZXJvIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHplcm8sCi0JICogc2V0IHRoZSB2YWx1ZSB0byB6ZXJvIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCB3YWl0VG9TZXRaZXJvKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCB3YWl0VG9Td2FwKGludCBleHBlY3RlZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFcXVhbF8oZXhwZWN0ZWRWYWx1ZSk7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFcXVhbChpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsRXF1YWxfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgIT0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgcmVtb3ZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhCi0JICogdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsTm90RXF1YWxfKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbE5vdEVxdWFsXyh2KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA9PSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgIT0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB6ZXJvIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IHplcm87IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB6ZXJvLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsWmVybyhsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVxdWFsKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gemVybyBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBub3QgemVybzsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPgotCSAqIHplcm8sIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90WmVybyhsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbE5vdEVxdWFsKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIGEgdmFsdWUgZ3JlYXRlcgotCSAqIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEdyZWF0ZXJUaGFuKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5fKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEdyZWF0ZXJUaGFuXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbl8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA8PSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPiB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGdyZWF0ZXIKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPCB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPj0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBsZXNzCi0JICogdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTGVzc1RoYW4oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxMZXNzVGhhbl8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsTGVzc1RoYW5fKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlID49IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA8IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIGEgdmFsdWUgbGVzcwotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTGVzc1RoYW5PckVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA+IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA8PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgcG9zaXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBwb3NpdGl2ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHBvc2l0aXZlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsUG9zaXRpdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbigwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbm90IHBvc2l0aXZlCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgbm90IHBvc2l0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbm90IHBvc2l0aXZlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90UG9zaXRpdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgbmVnYXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBuZWdhdGl2ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5lZ2F0aXZlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTGVzc1RoYW4oMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBuZWdhdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5vdCBuZWdhdGl2ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5vdCBuZWdhdGl2ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdE5lZ2F0aXZlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UKLQkgKiBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nCi0JICogd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRWYWx1ZShpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB6ZXJvLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHplcm8KLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gemVybyBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHplcm87IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8sIHNldAotCSAqIHRoZSB2YWx1ZSB0byB6ZXJvIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZSgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcKLQkgKiB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlOyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFcXVhbF8oZXhwZWN0ZWRWYWx1ZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhTeW5jaHJvbml6ZWRJbnQgc2kpIHsKLQkJaW50IHRoaXNWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJaW50IG90aGVyVmFsdWUgPSBzaS5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gdGhpc1ZhbHVlIDwgb3RoZXJWYWx1ZSA/IC0xIDogKHRoaXNWYWx1ZSA9PSBvdGhlclZhbHVlID8gMCA6IDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlyZXR1cm4gKFN5bmNocm9uaXplZEludCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN5bmNocm9uaXplZEludCkgJiYKLQkJCQkodGhpcy5nZXRWYWx1ZSgpID09ICgoU3luY2hyb25pemVkSW50KSBvYmopLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0VmFsdWUoKSkgKyAnXSc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTU0ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhbiBvYmplY3Qgb2YgdHlwZSA8Y29kZT5WPC9jb2RlPi4KLSAqIEl0IGFsc28gcHJvdmlkZXMgcHJvdG9jb2wgZm9yIHN1c3BlbmRpbmcgYSB0aHJlYWQgdW50aWwgdGhlCi0gKiB2YWx1ZSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gb3IgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUsCi0gKiB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqIAotICogQHBhcm0gViB0aGUgdHlwZSBvZiB0aGUgc3luY2hyb25pemVkIG9iamVjdCdzIHZhbHVlCi0gKiBAc2VlIE9iamVjdFJlZmVyZW5jZQotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkT2JqZWN0PFY+Ci0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgViB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFYgdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgb2JqZWN0IGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFYgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgc3luY2hyb25pemVkIG9iamVjdCBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVFcXVhbHMoViB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVOb3RFcXVhbChWIHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgViBzZXRWYWx1ZV8oViB2KSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJaWYgKHRoaXMudmFsdWUgIT0gdikgewotCQkJdGhpcy52YWx1ZSA9IHY7Ci0JCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQl9Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgc2V0IGl0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgY29tcGFyZUFuZFN3YXAoViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuY29tcGFyZUFuZFN3YXBfKGV4cGVjdGVkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgViBjb21wYXJlQW5kU3dhcF8oViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCBleHBlY3RlZFZhbHVlKSA/IHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKSA6IHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN5bmNocm9uaXplZCBvYmplY3QgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJcyhWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxWYWx1ZUlzXyhWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy52YWx1ZSwgdikpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUKLQkgKiB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFZhbHVlSXNOb3RfKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIHYpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPm51bGw8L2NvZGU+LCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTnVsbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90TnVsbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJc05vdChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIHdhaXRUb1NldFZhbHVlKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQKLQkgKiBiYWNrIHRvIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViB3YWl0VG9TZXROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhleHBlY3RlZFZhbHVlKTsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXMoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc18odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc18oViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYQotCSAqIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNOb3QoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc05vdF8oViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSAhPSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXMobnVsbCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3ROdWxsKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc05vdChudWxsLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZwotCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VmFsdWUoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90Xyh2LCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8odik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlCi0JICogZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPjsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4sIHNldAotCSAqIHRoZSB2YWx1ZSB0byA8Y29kZT5udWxsPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXROdWxsKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUobnVsbCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlCi0JICogYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nCi0JICogdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZTsgcmV0dXJuCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1N3YXAoViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhleHBlY3RlZFZhbHVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSB2YWx1ZSBmcm9tIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3Q8Vj4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3Q8Vj4gY2xvbmUgPSAoU3luY2hyb25pemVkT2JqZWN0PFY+KSBzdXBlci5jbG9uZSgpOwotCQkJCXJldHVybiBjbG9uZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN5bmNocm9uaXplZE9iamVjdDw/PikgJiYKLQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0VmFsdWUoKSwgKChTeW5jaHJvbml6ZWRPYmplY3Q8Pz4pIG9iaikuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJT2JqZWN0IHYgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCXJldHVybiAodiA9PSBudWxsKSA/IDAgOiB2Lmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0VmFsdWUoKSkgKyAnXSc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVhNGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBRdWV1ZX0gaW50ZXJmYWNlLgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogcXVldWUgaXMgZW1wdHkgb3Igbm90IGVtcHR5LCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFF1ZXVlPEU+Ci0JaW1wbGVtZW50cyBRdWV1ZTxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgcXVldWUuICovCi0JcHJpdmF0ZSBmaW5hbCBRdWV1ZTxFPiBxdWV1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHF1ZXVlIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHF1ZXVlIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZShRdWV1ZTxFPiBxdWV1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChxdWV1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgcXVldWUgYW5kIGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoUXVldWU8RT4gcXVldWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHF1ZXVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVRdWV1ZTxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoKSB7Ci0JCXRoaXMobmV3IFNpbXBsZVF1ZXVlPEU+KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBRdWV1ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgZWxlbWVudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuZW5xdWV1ZV8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5xdWV1ZV8oRSBlbGVtZW50KSB7Ci0JCXRoaXMucXVldWUuZW5xdWV1ZShlbGVtZW50KTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgRSBkZXF1ZXVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmRlcXVldWVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIEUgZGVxdWV1ZV8oKSB7Ci0JCUUgZWxlbWVudCA9IHRoaXMucXVldWUuZGVxdWV1ZSgpOwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnF1ZXVlLnBlZWsoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMucXVldWUuaXNFbXB0eSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy5xdWV1ZS5pc0VtcHR5KCkgIT0gZW1wdHkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHksCi0JICogdGhlbiAiZW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZQotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvRW5xdWV1ZShFIGVsZW1lbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlKTsKLQkJCXRoaXMuZW5xdWV1ZV8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJkZXF1ZXVlIiBhbiBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCByZXR1cm4gaXQuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9EZXF1ZXVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlKTsKLQkJCXJldHVybiB0aGlzLmRlcXVldWVfKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZAotCSAqIGVtcHR5IHN0YXR1cyB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUncyBlbXB0eSBzdGF0dXMgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHksIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnF1ZXVlLmlzRW1wdHkoKSAhPSBlbXB0eSkgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnF1ZXVlLmlzRW1wdHkoKSA9PSBlbXB0eSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5Ci0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBxdWV1ZSBpcyBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSBhbHJlYWR5IGhhcyBzb21ldGhpbmcgb24gaXQsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHksCi0JICogdGhlbiAiZW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZQotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdGllZCBvdXQKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiAiZW5xdWV1ZWluZyIgdGhlIGl0ZW0uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKLQkgKiBpdGVtIHdhcyBlbnF1ZXVlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5LCAiZW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIGFuZAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvRW5xdWV1ZShFIGVsZW1lbnQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLmVucXVldWVfKGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJkZXF1ZXVlIiBhbiBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCByZXR1cm4gaXQuCi0JICogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBub3RoaW5nIGlzICJlbnF1ZXVlZCIgb24gdG8gaXQgYmVmb3JlIHRoZQotCSAqIHRpbWUtb3V0LCB0aHJvdyBhIG5vIHN1Y2ggZWxlbWVudCBleGNlcHRpb24uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuCi0JICogSWYgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgImRlcXVldWUiIGFuIGl0ZW0gYW5kCi0JICogcmV0dXJuIGl0IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb0RlcXVldWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlyZXR1cm4gdGhpcy5kZXF1ZXVlXygpOwotCQkJfQotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBxdWV1ZSBpbiBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBwdWJsaWMgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogIkRyYWluIiBhbGwgdGhlIGN1cnJlbnQgaXRlbXMgZnJvbSB0aGUgcXVldWUgaW50byBzcGVjaWZpZWQgcXVldWUuCi0JICovCi0JcHVibGljIHZvaWQgZHJhaW5UbyhRdWV1ZTxFPiBxKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5kcmFpblRvXyhxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBkcmFpblRvXyhRdWV1ZTxFPiBxKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQl3aGlsZSAoICEgdGhpcy5xdWV1ZS5pc0VtcHR5KCkpIHsKLQkJCXEuZW5xdWV1ZSh0aGlzLnF1ZXVlLmRlcXVldWUoKSk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAoY2hhbmdlZCkgewotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoZSBxdWV1ZSBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gJ1snICsgdGhpcy5xdWV1ZS50b1N0cmluZygpICsgJ10nOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzBhNGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTdGFja30gaW50ZXJmYWNlLgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogc3RhY2sgaXMgZW1wdHkgb3Igbm90IGVtcHR5LCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgc3RhY2suICovCi0JcHJpdmF0ZSBmaW5hbCBTdGFjazxFPiBzdGFjazsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHN0YWNrIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaywgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdGFjayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgc3RhY2sgYW5kIGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soU3RhY2s8RT4gc3RhY2spIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN0YWNrID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBzdGFjayB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVTdGFjazxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBzdGFjayB0aGF0IGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soKSB7Ci0JCXRoaXMobmV3IFNpbXBsZVN0YWNrPEU+KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGFjayBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwdXNoKEUgZWxlbWVudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMucHVzaF8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaF8oRSBlbGVtZW50KSB7Ci0JCXRoaXMuc3RhY2sucHVzaChlbGVtZW50KTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwb3AoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMucG9wXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBFIHBvcF8oKSB7Ci0JCUUgbyA9IHRoaXMuc3RhY2sucG9wKCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCXJldHVybiBvOwotCX0KLQotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc3RhY2sucGVlaygpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdGFjay5pc0VtcHR5KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sncyBlbXB0eSBzdGF0dXMgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnN0YWNrLmlzRW1wdHkoKSAhPSBlbXB0eSkgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90RW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSwKLQkgKiB0aGVuICJwdXNoIiB0aGUgc3BlY2lmaWVkIGl0ZW0gb24gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1B1c2goRSBlbGVtZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18odHJ1ZSk7Ci0JCQl0aGlzLnB1c2hfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAicG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb1BvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhmYWxzZSk7Ci0JCQlyZXR1cm4gdGhpcy5wb3BfKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZAotCSAqIGVtcHR5IHN0YXR1cyB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sncyBlbXB0eSBzdGF0dXMgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHksIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnN0YWNrLmlzRW1wdHkoKSAhPSBlbXB0eSkgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnN0YWNrLmlzRW1wdHkoKSA9PSBlbXB0eSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5Ci0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzdGFjayBpcyBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGVtcHR5LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHN0YWNrIGlzIG5vdCBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjayBhbHJlYWR5IGhhcyBzb21ldGhpbmcgb24gaXQsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHksCi0JICogdGhlbiAicHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIG9uIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHN0YWNrIGlzIG5vdCBlbXB0aWVkIG91dAotCSAqIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqICJwdXNoaW5nIiB0aGUgaXRlbS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZQotCSAqIGl0ZW0gd2FzIHB1c2hlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGVtcHR5LCAicHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIGFuZAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvUHVzaChFIGVsZW1lbnQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnB1c2hfKGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJwb3AiIGFuIGl0ZW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgcmV0dXJuIGl0LgotCSAqIElmIHRoZSBzdGFjayBpcyBlbXB0eSBhbmQgbm90aGluZyBpcyAicHVzaGVkIiBvbiB0byBpdCBiZWZvcmUgdGhlCi0JICogdGltZS1vdXQsIHRocm93IGFuIGVtcHR5IHN0YWNrIGV4Y2VwdGlvbi4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgbm90IGVtcHR5LCAicG9wIiBhbiBpdGVtIGFuZAotCSAqIHJldHVybiBpdCBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9Qb3AobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlyZXR1cm4gdGhpcy5wb3BfKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHN0YWNrIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIHB1YmxpYyBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3RhY2sgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICdbJyArIHRoaXMuc3RhY2sudG9TdHJpbmcoKSArICddJzsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTIwMzhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1hbmQgaW50ZXJmYWNlIGFsbG93cyB0aGUgY2xpZW50IHRvCi0gKiBzcGVjaWZ5IGEgZGlmZmVyZW50IENvbW1hbmQgZm9yIGVhY2ggdGhyZWFkLgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkTG9jYWxDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGZpbmFsIFRocmVhZExvY2FsPENvbW1hbmQ+IHRocmVhZExvY2FsOwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGRlZmF1bHRDb21tYW5kOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgY29tbWFuZCBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIFRocmVhZExvY2FsQ29tbWFuZCgpIHsKLQkJdGhpcyhDb21tYW5kLk51bGwuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIFRocmVhZExvY2FsQ29tbWFuZChDb21tYW5kIGRlZmF1bHRDb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVmYXVsdENvbW1hbmQgPSBkZWZhdWx0Q29tbWFuZDsKLQkJdGhpcy50aHJlYWRMb2NhbCA9IHRoaXMuYnVpbGRUaHJlYWRMb2NhbCgpOwotCX0KLQotCXByb3RlY3RlZCBUaHJlYWRMb2NhbDxDb21tYW5kPiBidWlsZFRocmVhZExvY2FsKCkgewotCQlyZXR1cm4gbmV3IFRocmVhZExvY2FsPENvbW1hbmQ+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdGhpcy5nZXQoKS5leGVjdXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0KCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSB0aGlzLnRocmVhZExvY2FsLmdldCgpOwotCQlyZXR1cm4gKGNvbW1hbmQgIT0gbnVsbCkgPyBjb21tYW5kIDogdGhpcy5kZWZhdWx0Q29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29tbWFuZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy50aHJlYWRMb2NhbC5zZXQoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29tbWFuZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXQoKS50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1NzIyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kRXhlY3V0b3IgaW50ZXJmYWNlIGFsbG93cyB0aGUgY2xpZW50IHRvCi0gKiBzcGVjaWZ5IGEgZGlmZmVyZW50IENvbW1hbmQgRXhlY3V0b3IgZm9yIGVhY2ggdGhyZWFkLgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IgewotCXByb3RlY3RlZCBmaW5hbCBUaHJlYWRMb2NhbDxDb21tYW5kRXhlY3V0b3I+IHRocmVhZExvY2FsOwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kRXhlY3V0b3IgZGVmYXVsdENvbW1hbmRFeGVjdXRvcjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNvbW1hbmQgZXhlY3V0b3Igc2ltcGx5IGV4ZWN1dGVzIHRoZSBjb21tYW5kIGRpcmVjdGx5LgotCSAqLwotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoQ29tbWFuZEV4ZWN1dG9yIGRlZmF1bHRDb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWZhdWx0Q29tbWFuZEV4ZWN1dG9yID0gZGVmYXVsdENvbW1hbmRFeGVjdXRvcjsKLQkJdGhpcy50aHJlYWRMb2NhbCA9IHRoaXMuYnVpbGRUaHJlYWRMb2NhbCgpOwotCX0KLQotCXByb3RlY3RlZCBUaHJlYWRMb2NhbDxDb21tYW5kRXhlY3V0b3I+IGJ1aWxkVGhyZWFkTG9jYWwoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZ2V0VGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKS5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kRXhlY3V0b3IgZ2V0VGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCUNvbW1hbmRFeGVjdXRvciBjZSA9IHRoaXMudGhyZWFkTG9jYWwuZ2V0KCk7Ci0JCXJldHVybiAoY2UgIT0gbnVsbCkgPyBjZSA6IHRoaXMuZGVmYXVsdENvbW1hbmRFeGVjdXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29tbWFuZCBleGVjdXRvciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMudGhyZWFkTG9jYWwuc2V0KGNvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29tbWFuZAotCSAqIGV4ZWN1dG9yLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjZkNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFZhcmlvdXMgdXRpbGl0eSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgVG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gKHZhbHVlMSA9PSBudWxsKSA/ICh2YWx1ZTIgPT0gbnVsbCkgOiB2YWx1ZTEuZXF1YWxzKHZhbHVlMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiAhIHZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UcmFuc2Zvcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YzJiYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gdHJhbnNmb3JtIG9iamVjdHMuCi0gKiBUcmFuc2Zvcm0gYW4gb2JqZWN0IG9mIHR5cGUgVDEgdG8gYW4gb2JqZWN0IG9mIHR5cGUgVDIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNmb3JtZXI8VDEsIFQyPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyYW5zZm9ybWVkIG9iamVjdC4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJ0cmFuc2Zvcm0iIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCVQyIHRyYW5zZm9ybShUMSBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTMSwgUzI+IGltcGxlbWVudHMgVHJhbnNmb3JtZXI8UzEsIFMyPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmFuc2Zvcm1lci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTMSwgUzI+IGltcGxlbWVudHMgVHJhbnNmb3JtZXI8UzEsIFMyPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmFuc2Zvcm1lci5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2Rlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiM2NkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgZW5jb2RlciB3aWxsIHJlcGxhY2UgYW55IG9mIGEgc3BlY2lmaWVkIHNldCBvZiBjaGFyYWN0ZXJzIHdpdGggYW4gWE1MCi0gKiAiY2hhcmFjdGVyIHJlZmVyZW5jZSI6ICcvJyA9PiAiJiN4MmY7IgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MU3RyaW5nRW5jb2RlciB7Ci0KLQkvKiogVGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gKi8KLQlwcml2YXRlIGZpbmFsIGNoYXJbXSBjaGFyczsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUgb2YgdGhlIGhpZ2hlc3QgY2hhcmFjdGVyIGluIHRoZSBzZXQgYWJvdmUuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyIG1heENoYXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbmNvZGVyIHRoYXQgY29udmVydHMgdGhlIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycwotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBYTUxTdHJpbmdFbmNvZGVyKGNoYXJbXSBjaGFycykgewotCQlzdXBlcigpOwotCQlpZiAoY2hhcnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhlIGFtcGVyc2FuZCBtdXN0IGJlIGluY2x1ZGVkIHNpbmNlIGl0IGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKGNoYXJzLCAnJicpKSB7Ci0JCQl0aGlzLmNoYXJzID0gY2hhcnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoYXJzID0gQXJyYXlUb29scy5hZGQoY2hhcnMsICcmJyk7Ci0JCX0KLQkJdGhpcy5tYXhDaGFyID0gdGhpcy5jYWxjdWxhdGVNYXhJbnZhbGlkRmlsZU5hbWVDaGFyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGUKLQkgKiBzZWFyY2ggZm9yIGEgY2hhcmFjdGVyIGluIHRoZSBzZXQuCi0JICogQHNlZSAjY2hhcklzVG9CZUVuY29kZWQoY2hhcikKLQkgKi8KLQlwcml2YXRlIGNoYXIgY2FsY3VsYXRlTWF4SW52YWxpZEZpbGVOYW1lQ2hhcigpIHsKLQkJY2hhcltdIGxvY2FsQ2hhcnMgPSB0aGlzLmNoYXJzOwotCQljaGFyIG1heCA9IDA7Ci0JCWZvciAoaW50IGkgPSBsb2NhbENoYXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQljaGFyIGMgPSBsb2NhbENoYXJzW2ldOwotCQkJaWYgKG1heCA8IGMpIHsKLQkJCQltYXggPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBhbnkgY2hhcmFjdGVycyBpbiB0aGUgc2V0Ci0JICogcmVwbGFjZWQgd2l0aCBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCS8vIGFsbG93IGZvciBhIGZldyBlbmNvZGVkIGNoYXJhY3RlcnMKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDIwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hcHBlbmRDaGFyYWN0ZXJUbyhzLmNoYXJBdChpKSwgc2IpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGFueSBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMKLQkgKiByZXBsYWNlZCBieSB0aGUgY2hhcmFjdGVycyB0aGVtc2VsdmVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzLmxlbmd0aCgpKTsKLQkJU3RyaW5nQnVpbGRlciB0ZW1wID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsJLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJdGhpcy5kZWNvZGVUbyhuZXcgU3RyaW5nUmVhZGVyKHMpLCBzYiwgdGVtcCk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBjb252ZXJ0aW5nIGl0IHRvIGFuIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2hhcmFjdGVyVG8oY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmICh0aGlzLmNoYXJJc1RvQmVFbmNvZGVkKGMpKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGMsIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG9uZSBvZiB0aGUgY2hhcmFjdGVycwotCSAqIHRvIGJlIGNvbnZlcnRlZCB0byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoYXJJc1RvQmVFbmNvZGVkKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPD0gdGhpcy5tYXhDaGFyKSAmJiBBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMuY2hhcnMsIGMpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcidzIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIChlLmcuICcvJyA9PiAiJiN4MmY7IikuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIiYjeCIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7Ci0JCXNiLmFwcGVuZCgnOycpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVUbyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZGVjb2RlVG9fKHJlYWRlciwgc2IsIHRlbXApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvXyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gLTEpIHsKLQkJCWlmIChjID09ICcmJykgewotCQkJCXRoaXMuZGVjb2RlQ2hhcmFjdGVyUmVmZXJlbmNlVG8ocmVhZGVyLCBzYiwgdGVtcCk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQl9Ci0JCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlQ2hhcmFjdGVyUmVmZXJlbmNlVG8oUmVhZGVyIHJlYWRlciwgU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nQnVpbGRlciB0ZW1wKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICcjJyk7Ci0JCWMgPSByZWFkZXIucmVhZCgpOwotCQl0aGlzLmNoZWNrQ2hhcihjLCAneCcpOwotCi0JCXRlbXAuc2V0TGVuZ3RoKDApOyAgLy8gcmUtdXNlIHRlbXAKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9ICc7JykgewotCQkJdGhpcy5jaGVja0VuZE9mU3RyZWFtKGMpOwotCQkJdGVtcC5hcHBlbmQoKGNoYXIpIGMpOwotCQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJU3RyaW5nIGNoYXJWYWx1ZSA9IHRlbXAudG9TdHJpbmcoKTsKLQkJaWYgKGNoYXJWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIG51bWVyaWMgc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzYi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoY2hhclZhbHVlLCAxNikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NoYXIoaW50IGMsIGludCBleHBlY3RlZCkgewotCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCWlmIChjICE9IGV4cGVjdGVkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBlY3RlZCAnIiArIChjaGFyKSBleHBlY3RlZCArICInLCBidXQgZW5jb3VudGVyZWQgJyIgKyAoY2hhcikgYyArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFbmRPZlN0cmVhbShpbnQgYykgewotCQlpZiAoYyA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZjcwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUVudW1lcmF0aW9uPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGVudW1lcmF0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlFbnVtZXJhdGlvbiBJTlNUQU5DRSA9IG5ldyBFbXB0eUVudW1lcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBFbnVtZXJhdGlvbjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUVudW1lcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExM2RmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5JdGVyYXRvckVudW1lcmF0aW9uPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEl0ZXJhdG9yfSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBFbnVtZXJhdGlvbn0uCi0gKiBIb3BlZnVsbHkgd2UgZG9uJ3QgaGF2ZSBtdWNoIG5lZWQgZm9yIHRoaXMuLi4uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGVudW1lcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW51bWVyYXRpb24gdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODUxNmI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5SXRlcmFibGU8L2NvZGU+IHByb3ZpZGVzIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIGZvciBhbiBhcnJheSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBBcnJheUl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgRVtdIGFycmF5OwotCXByaXZhdGUgZmluYWwgaW50IHN0YXJ0OwotCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+IGFycmF5Lmxlbmd0aCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXJ0OiAiICsgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChsZW5ndGggPCAwKSB8fCAobGVuZ3RoID4gYXJyYXkubGVuZ3RoIC0gc3RhcnQpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGg6ICIgKyBsZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hcnJheSA9IGFycmF5OwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPEU+KHRoaXMuYXJyYXksIHRoaXMuc3RhcnQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBBcnJheXMudG9TdHJpbmcodGhpcy5hcnJheSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkOWZjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5DaGFpbkl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhIHBsdWdnYWJsZSB7QGxpbmsgSXRlcmFibGV9Ci0gKiB0aGF0IGxvb3BzIG92ZXIgYSBjaGFpbiBvZiBhcmJpdHJhcmlseSBsaW5rZWQgb2JqZWN0cy4gVGhlIGNoYWluCi0gKiBzaG91bGQgYmUgbnVsbC10ZXJtaW5hdGVkIChpLmUuIGEgY2FsbCB0byB0aGUge0BsaW5rICNuZXh0TGluayhPYmplY3QpfQotICogbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCBpcyBwYXNzZWQgdGhlIGxhc3QKLSAqIGxpbmsgb2YgdGhlIGNoYWluKS4KLSAqIFRvIHVzZSwgc3VwcGx5IGEgc3RhcnRpbmcgbGluayBhbmQgc3VwcGx5IGEge0BsaW5rIENoYWluSXRlcmF0b3IuTGlua2VyfSBvcgotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYWJsZTwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IuCi0gKiBJZiB0aGUgc3RhcnRpbmcgbGluayBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGl0ZXJhYmxlIHdpbGwgYmUgZW1wdHkuCi0gKiBOb3RlIHRoaXMgaXRlcmFibGUgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENoYWluSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENoYWluSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIHN0YXJ0TGluazsKLQlwcml2YXRlIGZpbmFsIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IGxpbmtlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGEgZGVmYXVsdCBsaW5rZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgQ2hhaW5JdGVyYXRvci5MaW5rZXJ9LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhYmxlKEUgc3RhcnRMaW5rKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IHRoaXMuYnVpbGREZWZhdWx0TGlua2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGxpbmtlci4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYWJsZShFIHN0YXJ0TGluaywgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gbGlua2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IGxpbmtlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gYnVpbGREZWZhdWx0TGlua2VyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRMaW5rZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxFPih0aGlzLnN0YXJ0TGluaywgdGhpcy5saW5rZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbjsgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuIGFsdGVybmF0aXZlIHRvCi0JICogYnVpbGRpbmcgYSB7QGxpbmsgQ2hhaW5JdGVyYXRvci5MaW5rZXJ9LgotCSAqLwotCXByb3RlY3RlZCBFIG5leHRMaW5rKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGN1cnJlbnRMaW5rKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0YXJ0TGluayk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBsaW5rZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRMaW5rZXIgaW1wbGVtZW50cyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxFPiB7Ci0JCXB1YmxpYyBFIG5leHRMaW5rKEUgY3VycmVudExpbmspIHsKLQkJCXJldHVybiBDaGFpbkl0ZXJhYmxlLnRoaXMubmV4dExpbmsoY3VycmVudExpbmspOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTJhYWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLQotLyoqCi0gKiBQdWxsIHRvZ2V0aGVyIHJlbW92ZXIgc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBzdWJjbGFzc2VzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbG9uZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCWZpbmFsIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiByZW1vdmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZW1vdmVyID0gdGhpcy5idWlsZERlZmF1bHRSZW1vdmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lSXRlcmFibGUoQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZW1vdmVyID0gcmVtb3ZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IGJ1aWxkRGVmYXVsdFJlbW92ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFJlbW92ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCByZW1vdmFsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBtdXRhdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0UmVtb3ZlciBpbXBsZW1lbnRzIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiB7Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZShFIGVsZW1lbnQpIHsKLQkJCUNsb25lSXRlcmFibGUudGhpcy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0ZjE1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBvZiB7QGxpbmsgSXRlcmFibGV9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBJdGVyYWJsZX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDb21wb3NpdGVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlcyA9IGl0ZXJhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShFIG9iamVjdCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmFibGUsIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYWJsZTxJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIGNvbWJpbmVkIGl0ZXJhdG9ycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxFPih0aGlzLml0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SXRlcmFibGU8PyBleHRlbmRzIEU+LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KHRoaXMuaXRlcmFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oSXRlcmFibGU8PyBleHRlbmRzIEU+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdG9yIG9mIGl0ZXJhYmxlcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhYmxlcy5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MzI0NzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYWJsZTwvY29kZT4gaXMganVzdCB0aGF0LgotICogTWF5YmUganVzdCBhIHRvdWNoIGJldHRlci1wZXJmb3JtaW5nIHRoYW4ge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNFTVBUWV9TRVR9Ci0gKiBzaW5jZSB3ZSBkb24ndCBjcmVhdGUgYSBuZXcge0BsaW5rIEl0ZXJhdG9yfSBldmVyeSB0aW1lIHtAbGluayAjaXRlcmF0b3IoKX0gaXMgY2FsbGVkLgotICogKE5vdCBzdXJlIHdoeSB0aGV5IGRvIHRoYXQuLi4uKQotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgRW1wdHlJdGVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlIElOU1RBTkNFID0gbmV3IEVtcHR5SXRlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5SXRlcmFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWZmOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9GaWx0ZXJpbmdJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfSB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgaW4gdGhlCi0gKiBuZXN0ZWQgaXRlcmFibGUgYXJlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yLgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYWJsZTwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgZmlsdGVyZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBGaWx0ZXJpbmdJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmFibGU8RTEsIEUyPgotCWltcGxlbWVudHMgSXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlOwotCXByaXZhdGUgZmluYWwgRmlsdGVyPEUxPiBmaWx0ZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmFibGUgYW5kIGEgZGVmYXVsdCBmaWx0ZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCQl0aGlzLmZpbHRlciA9IHRoaXMuYnVpbGREZWZhdWx0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYWJsZSBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBGaWx0ZXI8RTE+IGZpbHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBGaWx0ZXI8RTE+IGJ1aWxkRGVmYXVsdEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0RmlsdGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSwgdGhpcy5maWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfSBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFMSBvKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IGZpbHRlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcjxFMT4gewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRTEgbykgewotCQkJcmV0dXJuIEZpbHRlcmluZ0l0ZXJhYmxlLnRoaXMuYWNjZXB0KG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dlbmVyaWNJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvR2VuZXJpY0l0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU0MmUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvR2VuZXJpY0l0ZXJhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlcmUKLSAqIGlzIG5vIHdheSB0byBhZGQgaW52YWxpZCBlbGVtZW50cyB0byB0aGUgaXRlcmFibGUuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNJdGVyYWJsZVdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxFPiBpdGVyYWJsZTsKLQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEdlbmVyaWNJdGVyYWJsZVdyYXBwZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHRoaXMgc2hvdWxkIGJlIGEgc2FmZSBjYXN0IC0gdGhlIGl0ZXJhdG9yIHdpbGwgb25seSBldmVyCi0JCS8vIHJldHVybiBFIChvciBhIHN1Yi10eXBlKSBmcm9tICNuZXh0KCkKLQkJdGhpcy5pdGVyYWJsZSA9IChJdGVyYWJsZTxFPikgaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9HcmFwaEl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiNTg0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPiBpcyBzaW1pbGFyIHRvIGEge0BsaW5rIFRyZWVJdGVyYWJsZX0KLSAqIGV4Y2VwdCB0aGF0IGl0IGNhbm5vdCBiZSBhc3N1bWVkIHRoYXQgYWxsIG5vZGVzIGFzc3VtZSBhIHN0cmljdCB0cmVlCi0gKiBzdHJ1Y3R1cmUuIEZvciBpbnN0YW5jZSwgaW4gYSB0cmVlLCBhIG5vZGUgY2Fubm90IGJlIGEgZGVzY2VuZGVudCBvZgotICogaXRzZWxmLCBidXQgYSBncmFwaCBtYXkgaGF2ZSBhIGN5Y2xpY2FsIHN0cnVjdHVyZS4KLSAqIAotICogQSA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogZ3JhcGggb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgbmV4dCBjb2xsZWN0aW9uIG9mIG5vZGVzIGluIHRoZSBncmFwaCwKLSAqIChvciA8ZW0+bmVpZ2hib3JzPC9lbT4pLCBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IKLSAqIGdldHRpbmcgPGVtPmFsbDwvZW0+IG9mIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGguCi0gKiAoZS5nLiBhIG5laWdoYm9yIGNhbiByZXR1cm4gaGlzIG5laWdoYm9ycywgYW5kIHRob3NlIG5laWdoYm9ycwotICogY2FuIHJldHVybiB0aGVpciBuZWlnaGJvcnMsIHdoaWNoIG1pZ2h0IGFsc28gaW5jbHVkZSB0aGUgb3JpZ2luYWwKLSAqIG5laWdoYm9yLCBidXQgeW91IG9ubHkgd2FudCB0byB2aXNpdCB0aGUgb3JpZ2luYWwgbmVpZ2hib3Igb25jZS4pCi0gKiA8cD4KLSAqIElmIGEgbmVpZ2hib3IgaGFzIGFscmVhZHkgYmVlbiB2aXNpdGVkIChkZXRlcm1pbmVkIGJ5IHVzaW5nIAotICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0pLCB0aGF0IG5laWdoYm9yIGlzIG5vdCB2aXNpdGVkIGFnYWluLAotICogbm9yIGFyZSB0aGUgbmVpZ2hib3JzIG9mIHRoYXQgb2JqZWN0LgotICogPHA+Ci0gKiBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIGNsYXNzIHRvIGVuc3VyZSBhIDxlbT5jb21wbGV0ZTwvZW0+IGdyYXBoLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgaW5pdGlhbCBub2RlIG9mIHRoZSBncmFwaCBvciBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBvZiB0aGUgaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfSB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGJlaGF2aW9yLCBpZiAKLSAqIGRlc2lyZWQsIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIEdyYXBoSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHM7Ci0JcHJpdmF0ZSBmaW5hbCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRSByb290KSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihyb290KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRSByb290LCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRS4uLiByb290cykgewotCQl0aGlzKEFycmF5cy5hc0xpc3Qocm9vdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRVtdIHJvb3RzLCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgTXIuIFJvZ2VycyB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gdGhpcy5idWlsZERlZmF1bHRNaXN0ZXJSb2dlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290cyA9IHJvb3RzOwotCQl0aGlzLm1pc3RlclJvZ2VycyA9IG1pc3RlclJvZ2VyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8RT4gYnVpbGREZWZhdWx0TWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRNaXN0ZXJSb2dlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxFPih0aGlzLnJvb3RzLCB0aGlzLm1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgbmV4dCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yb290cyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBNci4gUm9nZXJzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TWlzdGVyUm9nZXJzIGltcGxlbWVudHMgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8RT4gewotCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5laWdoYm9ycyhFIG5vZGUpIHsKLQkJCXJldHVybiBHcmFwaEl0ZXJhYmxlLnRoaXMubmVpZ2hib3JzKG5vZGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGRiZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIGEgY3VycmVudCBjb3B5IG9mIGEKLSAqIGNvbGxlY3Rpb24sIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQQotICogY29weSBvZiB0aGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcwotICogY2FsbGVkLiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb2xsZWN0aW9uIGNhbiBiZSBkaWZmZXJlbnQgd2l0aAotICogZWFjaCBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3IoKX0gKGkuZS4gaXQgaXMgImxpdmUiKS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHRocmVhZC1zYWZlIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4gZG9lcyBub3QKLSAqIHN1cHBvcnQgdGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPlJlbW92ZXI8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENsb25lSXRlcmF0b3IKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXZlQ2xvbmVJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgImxpdmUiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIHdpbGwgbm90IGJlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZW0gaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lSXRlcmFibGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgcmVtb3ZlciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBpdGVyYXRvcnMgdG8KLQkgKiByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBMaXZlQ2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLCB0aGlzLnJlbW92ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDgxOWYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5RdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUXVldWVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlF1ZXVlSXRlcmFibGU8L2NvZGU+IHByb3ZpZGVzIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIGZvciBhIHtAbGluayBRdWV1ZX0gb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGUgcXVldWUncyBlbGVtZW50cwotICogYXJlIHtAbGluayBRdWV1ZSNkZXF1ZXVlKCkgZGVxdWV1ZX1kIiBhcyB0aGUgaXRlcmFibGUncyBpdGVyYXRvciByZXR1cm5zCi0gKiB0aGVtIHdpdGggY2FsbHMgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBRdWV1ZQotICogQHNlZSBRdWV1ZUl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWV1ZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgUXVldWU8RT4gcXVldWU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcXVldWUuCi0JICovCi0JcHVibGljIFF1ZXVlSXRlcmFibGUoUXVldWU8RT4gcXVldWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBRdWV1ZUl0ZXJhdG9yPEU+KHRoaXMucXVldWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucXVldWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNGUyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYWJsZX0KLSAqIGFuZCByZXR1cm5zIGEgcmVhZC1vbmx5IHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBSZWFkT25seUl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgdGhlIHJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuaXRlcmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTdmYzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI2hhc05leHQoKX0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhYmxlPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIEl0ZXJhYmxlfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihPYmplY3QpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRJdGVyYWJsZShFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHRoaXMuZWxlbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc3ZGM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIGEgInNuYXBzaG90IiBvZiBhCi0gKiBjb2xsZWN0aW9uLCBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEEKLSAqIGNvcHkgb2YgdGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoZSBpdGVyYWJsZSBpcyBjb25zdHJ1Y3RlZC4KLSAqIEFzIGEgcmVzdWx0LCB0aGUgY29udGVudHMgb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZSB0aGUgc2FtZSB3aXRoCi0gKiBldmVyeSBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3IoKX0uCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHBhc3NlZCB0byB0aGUgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdGhyZWFkLXNhZmUgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9KTsKLSAqIG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mIGEgY29ycnVwdGVkIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSBhIDxjb2RlPlNuYXBzaG90Q2xvbmVJdGVyYWJsZTwvY29kZT4gZG9lcyBub3QKLSAqIHN1cHBvcnQgdGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPlNuYXBzaG90Q2xvbmVJdGVyYWJsZTwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYSB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPlJlbW92ZXI8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIDxwPgotICogVGhpcyBpdGVyYWJsZSBpcyB1c2VmdWwgZm9yIG11bHRpcGxlIHBhc3NlcyBvdmVyIGEgY29sbGVjdGlvbiB0aGF0IHNob3VsZCBub3QKLSAqIGJlIGNoYW5nZWQgKGUuZy4gYnkgYW5vdGhlciB0aHJlYWQpIGJldHdlZW4gcGFzc2VzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2xvbmVJdGVyYXRvcgotICogQHNlZSBMaXZlQ2xvbmVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU25hcHNob3RDbG9uZUl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBhcnJheTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgInNuYXBzaG90IiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkge0BsaW5rICNpdGVyYXRvcigpfQotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hcnJheSA9IGNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIHJlbW92ZXIgd2lsbCBiZSB1c2VkIGJ5IGFueSBnZW5lcmF0ZWQgaXRlcmF0b3JzIHRvCi0JICogcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXN1cGVyKHJlbW92ZXIpOwotCQl0aGlzLmFycmF5ID0gY29sbGVjdGlvbi50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbENsb25lSXRlcmF0b3I8RT4odGhpcy5yZW1vdmVyLCB0aGlzLmFycmF5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBBcnJheXMudG9TdHJpbmcodGhpcy5hcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uZSBpdGVyYXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwcm92aWRlIGFjY2VzcyB0byAiaW50ZXJuYWwiIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2NhbENsb25lSXRlcmF0b3I8RT4gZXh0ZW5kcyBDbG9uZUl0ZXJhdG9yPEU+IHsKLQkJcHJvdGVjdGVkIExvY2FsQ2xvbmVJdGVyYXRvcihSZW1vdmVyPEU+IHJlbW92ZXIsIE9iamVjdFtdIGFycmF5KSB7Ci0JCQlzdXBlcihyZW1vdmVyLCBhcnJheSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3RhY2tJdGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTE4MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdGFja0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhY2tJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGEge0BsaW5rIFN0YWNrfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBzdGFjaydzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFN0YWNrI3BvcCgpIHBvcH1wZWQiIGFzIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yIHJldHVybnMKLSAqIHRoZW0gd2l0aCBjYWxscyB0byB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFN0YWNrCi0gKiBAc2VlIFN0YWNrSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN0YWNrSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBTdGFjazxFPiBzdGFjazsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBzdGFjay4KLQkgKi8KLQlwdWJsaWMgU3RhY2tJdGVyYWJsZShTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFN0YWNrSXRlcmF0b3I8RT4odGhpcy5zdGFjayk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGFjayk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTFkYWY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIGVsZW1lbnRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpLCB0aGlzLnRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUxIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBvKSB7Ci0JCQlyZXR1cm4gVHJhbnNmb3JtYXRpb25JdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjI3Y2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYWJsZTwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiB7QGxpbmsgSXRlcmFibGV9IG9mIHRoZSBzZXQgb2Ygcm9vdHMKLSAqIDxsaT4gYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuIG9mIGVhY2ggY2hpbGQKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5UcmVlSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFRyZWVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzOwotCXByaXZhdGUgZmluYWwgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFLi4uIHJvb3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzCi0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFW10gcm9vdHMsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgYSBkZWZhdWx0IG1pZHdpZmUgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taWR3aWZlID0gdGhpcy5idWlsZERlZmF1bHRNaWR3aWZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cywgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IGJ1aWxkRGVmYXVsdE1pZHdpZmUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1pZHdpZmUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPEU+KHRoaXMucm9vdHMsIHRoaXMubWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyZWVJdGVyYXRvci5NaWR3aWZlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIG5leHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucm9vdHMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbWlkd2lmZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdE1pZHdpZmUgaW1wbGVtZW50cyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxFPiB7Ci0JCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBub2RlKSB7Ci0JCQlyZXR1cm4gVHJlZUl0ZXJhYmxlLnRoaXMuY2hpbGRyZW4obm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTQ5Y2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFycmF5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JZmluYWwgRVtdIGFycmF5OwkvLyBwcml2YXRlLXByb3RlY3RlZAotCWludCBjdXJzb3I7CQkvLyBwcml2YXRlLXByb3RlY3RlZAotCXByaXZhdGUgZmluYWwgaW50IG1heDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlpZiAoKHN0YXJ0IDwgMCkgfHwgKHN0YXJ0ID4gYXJyYXkubGVuZ3RoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhcnQ6ICIgKyBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGxlbmd0aCA8IDApIHx8IChsZW5ndGggPiBhcnJheS5sZW5ndGggLSBzdGFydCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aDogIiArIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFycmF5ID0gYXJyYXk7Ci0JCXRoaXMuY3Vyc29yID0gc3RhcnQ7Ci0JCXRoaXMubWF4ID0gc3RhcnQgKyBsZW5ndGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuY3Vyc29yICE9IHRoaXMubWF4OwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbdGhpcy5jdXJzb3IrK107Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjMwZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5TGlzdEl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIDxwPgotICogVGhlIG5hbWUgbWlnaHQgYmUgYSBiaXQgY29uZnVzaW5nOgotICogVGhpcyBpcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IGZvciBhbiA8Y29kZT5BcnJheTwvY29kZT47Ci0gKiA8ZW0+bm90PC9lbT4gYW4ge0BsaW5rIEl0ZXJhdG9yfSBmb3IgYSB7QGxpbmsgamF2YS51dGlsLkFycmF5TGlzdH0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYXRvcjxFPgotCWV4dGVuZHMgQXJyYXlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbWluOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXRoaXMoYXJyYXksIHN0YXJ0LCBhcnJheS5sZW5ndGggLSBzdGFydCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JCXRoaXMubWluID0gc3RhcnQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3I7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuY3Vyc29yIC0gMTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnNvciAhPSB0aGlzLm1pbjsKLQl9Ci0JCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCWlmICh0aGlzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXJldHVybiB0aGlzLmFycmF5Wy0tdGhpcy5jdXJzb3JdOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWI0NmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5DaGFpbkl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhIHBsdWdnYWJsZSB7QGxpbmsgSXRlcmF0b3J9Ci0gKiB0aGF0IGxvb3BzIG92ZXIgYSBjaGFpbiBvZiBhcmJpdHJhcmlseSBsaW5rZWQgb2JqZWN0cy4gVGhlIGNoYWluCi0gKiBzaG91bGQgYmUgbnVsbC10ZXJtaW5hdGVkIChpLmUuIGEgY2FsbCB0byB0aGUge0BsaW5rICNuZXh0TGluayhPYmplY3QpfQotICogbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCBpcyBwYXNzZWQgdGhlIGxhc3QKLSAqIGxpbmsgb2YgdGhlIGNoYWluKS4KLSAqIFRvIHVzZSwgc3VwcGx5IGEgc3RhcnRpbmcgbGluayBhbmQgc3VwcGx5IGEge0BsaW5rIExpbmtlcn0gb3IgCi0gKiBzdWJjbGFzcyA8Y29kZT5DaGFpbkl0ZXJhdG9yPC9jb2RlPiBhbmQgb3ZlcnJpZGUgdGhlCi0gKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZC4KLSAqIFRoZSBzdGFydGluZyBsaW5rIHdpbGwgYmUgdGhlIGZpcnN0IG9iamVjdCByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuCi0gKiBJZiB0aGUgc3RhcnRpbmcgbGluayBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGl0ZXJhdG9yIHdpbGwgYmUgZW1wdHkuCi0gKiBOb3RlIHRoaXMgaXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBFIG5leHRMaW5rOwotCXByaXZhdGUgZmluYWwgTGlua2VyPEU+IGxpbmtlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGEgZGlzYWJsZWQgbGlua2VyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBMaW5rZXJ9LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yKEUgc3RhcnRMaW5rKSB7Ci0JCXRoaXMoc3RhcnRMaW5rLCBMaW5rZXIuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGxpbmtlci4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvcihFIHN0YXJ0TGluaywgTGlua2VyPEU+IGxpbmtlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5leHRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IGxpbmtlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0TGluayAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLm5leHRMaW5rID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHRMaW5rOwotCQl0aGlzLm5leHRMaW5rID0gdGhpcy5uZXh0TGluayh0aGlzLm5leHRMaW5rKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbjsgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBuZXh0TGluayhFIGN1cnJlbnRMaW5rKSB7Ci0JCXJldHVybiB0aGlzLmxpbmtlci5uZXh0TGluayhjdXJyZW50TGluayk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uZXh0TGluayk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBDaGFpbkl0ZXJhdG9yfSB0byBsaW5rCi0JICogdGhlIGVsZW1lbnRzIGluIHRoZSBjaGFpbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpbmtlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbjsgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4KLQkJICovCi0JCVQgbmV4dExpbmsoVCBjdXJyZW50TGluayk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcmV0dXJuIG51bGwsIGluZGljYXRpbmcgdGhlIGNoYWluIGlzIGVuZGVkCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDaGFpbkl0ZXJhdG9yLkxpbmtlci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBMaW5rZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBDaGFpbkl0ZXJhdG9yLm5leHRMaW5rKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2hhaW5JdGVyYXRvci5MaW5rZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4ZWU0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGl0ZXJhdGVzIG92ZXIgYSBjb3B5IG9mIGEgY29sbGVjdGlvbiwKLSAqIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgc3luY2hyb25pemVkIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYW4ge0BsaW5rIFJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIHtAbGluayBSZW1vdmVyfS4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xvbmVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBFIGN1cnJlbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBSZW1vdmVyPEU+IHJlbW92ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFsbG93ZWQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSB7QGxpbmsgI3JlbW92ZSgpfSBtZXRob2Qgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0uCi0JICovCi0JcHVibGljIENsb25lSXRlcmF0b3IoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQl0aGlzKGNvbGxlY3Rpb24sIFJlbW92ZXIuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSB7QGxpbmsgI3JlbW92ZSgpfSBtZXRob2Qgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0uCi0JICovCi0JcHVibGljIENsb25lSXRlcmF0b3IoRVtdIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIFJlbW92ZXIuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgcmVtb3ZlciB0byByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZQotCSAqIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENsb25lSXRlcmF0b3IoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXRoaXMocmVtb3ZlciwgY29sbGVjdGlvbi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCByZW1vdmVyIHRvIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlCi0JICogb3JpZ2luYWwgYXJyYXkuCi0JICovCi0JcHVibGljIENsb25lSXRlcmF0b3IoRVtdIGFycmF5LCBSZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJdGhpcyhyZW1vdmVyLCBhcnJheS5jbG9uZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHN1YmNsYXNzZXMuCi0JICogU3dhcCBvcmRlciBvZiBhcmd1bWVudHMgdG8gcHJldmVudCBjb2xsaXNpb24gd2l0aCBvdGhlciBjb25zdHJ1Y3Rvci4KLQkgKiBUaGUgcGFzc2VkIGluIGFycmF5IHdpbGwgKm5vdCogYmUgY2xvbmVkLgotCSAqLwotCXByb3RlY3RlZCBDbG9uZUl0ZXJhdG9yKFJlbW92ZXI8RT4gcmVtb3ZlciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGFycmF5KTsKLQkJdGhpcy5jdXJyZW50ID0gbnVsbDsKLQkJdGhpcy5yZW1vdmVyID0gcmVtb3ZlcjsKLQkJdGhpcy5yZW1vdmVBbGxvd2VkID0gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmN1cnJlbnQgPSB0aGlzLm5lc3RlZE5leHQoKTsKLQkJdGhpcy5yZW1vdmVBbGxvd2VkID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmICggISB0aGlzLnJlbW92ZUFsbG93ZWQpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnJlbnQpOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBwYXNzZWQgaW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBoZWxkIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4sCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKDxjb2RlPk9iamVjdFtdPC9jb2RlPikuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgbmVzdGVkTmV4dCgpIHsKLQkJcmV0dXJuIChFKSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFJlbW92ZXJ9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShFIGUpIHsKLQkJdGhpcy5yZW1vdmVyLnJlbW92ZShlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBtZW1iZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIENsb25lSXRlcmF0b3J9IHRvIHJlbW92ZQotCSAqIGVsZW1lbnRzIGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb247IHNpbmNlIHRoZSBpdGVyYXRvcgotCSAqIGRvZXMgbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFJlbW92ZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKFQgZWxlbWVudCk7Ci0KLQotCQlmaW5hbCBjbGFzcyBSZWFkT25seTxTPiBpbXBsZW1lbnRzIFJlbW92ZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlbW92ZXIgSU5TVEFOQ0UgPSBuZXcgUmVhZE9ubHkoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gUmVtb3ZlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIFJlYWRPbmx5KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDbG9uZUl0ZXJhdG9yLlJlbW92ZXIuUmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQ3Y2M4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+IGl0ZXJhdGVzIG92ZXIgYSBjb3B5IG9mIGEgbGlzdCwKLSAqIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGxpc3QgcGFzc2VkIHRvIHRoZSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHN5bmNocm9uaXplZDsgb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YKLSAqIGEgY29ycnVwdGVkIGxpc3QgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9LgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGEge0BsaW5rIE11dGF0b3J9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiBtb2RpZmljYXRpb24gb3BlcmF0aW9ucyB0byB0aGUge0BsaW5rIE11dGF0b3J9LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xvbmVMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPE9iamVjdD4gbGlzdEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IGN1cnNvcjsKLQlwcml2YXRlIFN0YXRlIHN0YXRlOwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCi0JcHJpdmF0ZSBlbnVtIFN0YXRlIHsKLQkJVU5LTk9XTiwKLQkJUFJFVklPVVMsCi0JCU5FWFQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGVtLgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdCwgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBtb2RpZmljYXRpb24gbWV0aG9kcyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZW0uCi0JICovCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKEVbXSBhcnJheSkgewotCQl0aGlzKGFycmF5LCBNdXRhdG9yLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBsaXN0IG11dGF0b3IgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJdGhpcyhtdXRhdG9yLCBsaXN0LnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBsaXN0IG11dGF0b3IgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihFW10gYXJyYXksIE11dGF0b3I8RT4gbXV0YXRvcikgewotCQl0aGlzKG11dGF0b3IsIGFycmF5LmNsb25lKCkpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIHVzZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiBTd2FwIG9yZGVyIG9mIGFyZ3VtZW50cyB0byBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIG90aGVyIGNvbnN0cnVjdG9yLgotCSAqIFRoZSBwYXNzZWQgaW4gYXJyYXkgd2lsbCAqbm90KiBiZSBjbG9uZWQuCi0JICovCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhdG9yKE11dGF0b3I8RT4gbXV0YXRvciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIGJ1aWxkIGEgY29weSBvZiB0aGUgbGlzdCBhbmQga2VlcCBpdCBpbiBzeW5jaCB3aXRoIG9yaWdpbmFsIChpZiB0aGUgbXV0YXRvciBhbGxvd3MgY2hhbmdlcykKLQkJLy8gdGhhdCB3YXkgdGhlIG5lc3RlZCBsaXN0IGl0ZXJhdG9yIHdpbGwgbWFpbnRhaW4gc29tZSBvZiBvdXIgc3RhdGUKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhcnJheSkubGlzdEl0ZXJhdG9yKCk7Ci0JCXRoaXMubXV0YXRvciA9IG11dGF0b3I7Ci0JCXRoaXMuY3Vyc29yID0gMDsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLlVOS05PV047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgbmV4dCA9IHRoaXMubmVzdGVkTmV4dCgpOwotCQl0aGlzLmN1cnNvcisrOwotCQl0aGlzLnN0YXRlID0gU3RhdGUuTkVYVDsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCQlpZiAodGhpcy5zdGF0ZSA9PSBTdGF0ZS5QUkVWSU9VUykgewotCQkJdGhpcy5yZW1vdmUodGhpcy5jdXJzb3IpOwotCQl9IGVsc2UgewotCQkJdGhpcy5jdXJzb3ItLTsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgaW5kZXgKLQkJRSBwcmV2aW91cyA9IHRoaXMubmVzdGVkUHJldmlvdXMoKTsKLQkJdGhpcy5jdXJzb3ItLTsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLlBSRVZJT1VTOwotCQlyZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5hZGQodGhpcy5jdXJzb3IsIG8pOwotCQl0aGlzLmN1cnNvcisrOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLmxpc3RJdGVyYXRvci5zZXQobyk7Ci0JCWlmICh0aGlzLnN0YXRlID09IFN0YXRlLlBSRVZJT1VTKSB7Ci0JCQl0aGlzLnNldCh0aGlzLmN1cnNvciwgbyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldCh0aGlzLmN1cnNvciAtIDEsIG8pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGxpc3QgcGFzc2VkIGluIGR1cmluZyBjb25zdHJ1Y3Rpb24gaGVsZCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5ICg8Y29kZT5PYmplY3RbXTwvY29kZT4pLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIG5lc3RlZE5leHQoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0IHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPiwKLQkgKiBzbyB0aGlzIGNhc3QgaXMgbm90IGEgcHJvYmxlbS4gV2UgbmVlZCB0aGlzIGNhc3QgYmVjYXVzZQotCSAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2VyZSBjb3BpZWQgaW50bwotCSAqIGFuIG9iamVjdCBhcnJheSAoPGNvZGU+T2JqZWN0W108L2NvZGU+KS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWRQcmV2aW91cygpIHsKLQkJcmV0dXJuIChFKSB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3IuYWRkKGluZGV4LCBvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJdGhpcy5tdXRhdG9yLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0KGludCBpbmRleCwgRSBvKSB7Ci0JCXRoaXMubXV0YXRvci5zZXQoaW5kZXgsIG8pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBDbG9uZUxpc3RJdGVyYXRvcn0gdG8gcmVtb3ZlCi0JICogZWxlbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdDsgc2luY2UgdGhlIGxpc3QgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNdXRhdG9yPFQ+IHsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCQkgKi8KLQkJdm9pZCBhZGQoaW50IGluZGV4LCBUIG8pOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgc2V0KGludCBpbmRleCwgVCBvKTsKLQotCi0JCWZpbmFsIGNsYXNzIFJlYWRPbmx5PFM+IGltcGxlbWVudHMgTXV0YXRvcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTXV0YXRvciBJTlNUQU5DRSA9IG5ldyBSZWFkT25seSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNdXRhdG9yPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgUmVhZE9ubHkoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIGFkZCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHNldCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvci5SZWFkT25seSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjJlNzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBjb2xsZWN0aW9uCi0gKiBvZiB7QGxpbmsgSXRlcmF0b3J9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBjdXJyZW50SXRlcmF0b3I7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGFsbCB0aGUgZWxlbWVudHMgaGVsZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYWJsZXMuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQkJCQlyZXR1cm4gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEUgb2JqZWN0LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhvYmplY3QsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEUgb2JqZWN0LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4uLi4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmFibGU8SXRlcmFibGU8PyBleHRlbmRzIEU+PihpdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWRDdXJyZW50SXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMuY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKLQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0ICdsYXN0SXRlcmF0b3JUb1JldHVybk5leHQnCi0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3I7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCA9PSBudWxsKSB7Ci0JCQkvLyBDb21wb3NpdGVJdGVyYXRvciNuZXh0KCkgaGFzIG5ldmVyIGJlZW4gY2FsbGVkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB7QGxpbmsgY3VycmVudEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayBJdGVyYXRvciNoYXNOZXh0KCl9Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQ3VycmVudEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKCggISB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZhYjVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiB7QGxpbmsgTGlzdEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgTGlzdEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjxFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEU+IG5leHRJdGVyYXRvcjsKLQlwcml2YXRlIGludCBuZXh0SW5kZXg7Ci0gCS8qKgotIAkgKiB0cnVlIGlmICJuZXh0IiB3YXMgbGFzdCByZXR1cm5lZDsgZmFsc2UgaWYgInByZXZpb3VzIiB3YXMgbGFzdCByZXR1cm5lZDsKLSAJICogdGhpcyBkZXRlcm1pbmVzIHRoZSBlZmZlY3Qgb2Yge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0gb24ge0BsaW5rICNuZXh0SW5kZXh9Ci0gCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZXh0UmV0dXJuZWQ7Ci0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8RT4gbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBMaXN0PEU+PiBsaXN0cykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3Q8RT4sIExpc3RJdGVyYXRvcjxFPj4obGlzdHMubGlzdEl0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IHRyYW5zZm9ybShMaXN0PEU+IGxpc3QpIHsKLQkJCQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjxFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCQl0aGlzLm5leHRJbmRleCA9IDA7Ci0JCXRoaXMubmV4dFJldHVybmVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0PEU+IGxpc3QpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PEU+IGxpc3QsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8RT4uLi4gbGlzdHMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGxpc3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXRoaXMubmV4dEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSB0cnVlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnJlbW92ZSgpOwotCQlpZiAodGhpcy5uZXh0UmV0dXJuZWQpIHsKLQkJCS8vIGRlY3JlbWVudCB0aGUgaW5kZXggYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgaGFzIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxpc3QKLQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQuc2V0KGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgJ25leHRJdGVyYXRvcicgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc1ByZXZpb3VzKCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpcnN0IGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJldmlvdXNJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmICduZXh0SXRlcmF0b3InIGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDIwYzAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIChub3QpIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU3ODJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUxpc3RJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIChub3QpIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlMaXN0SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlMaXN0SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RJdGVyYXRvcjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUxpc3RJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlMTYzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5lbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbnVtZXJhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM3MDhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYXRvciBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXI8L2NvZGU+LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgZmlsdGVyZWQgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiB7QGxpbmsgI2hhc05leHQoKX0gbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4pLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgZmlsdGVyZWQgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIGZpbHRlcmVkCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBGaWx0ZXI8RTE+IGZpbHRlcjsKLQlwcml2YXRlIEUyIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBpdGVyYWJsZSBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYXRvciBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMoaXRlcmF0b3IsIEZpbHRlci5EaXNhYmxlZC48RTE+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUsIEZpbHRlcjxFMT4gZmlsdGVyKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3IsIEZpbHRlcjxFMT4gZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRTIgcmVzdWx0ID0gdGhpcy5uZXh0OwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQmVjYXVzZSB3ZSBuZWVkIHRvIHByZS1sb2FkIHRoZSBuZXh0IGVsZW1lbnQKLQkgKiB0byBiZSByZXR1cm5lZCwgd2UgY2Fubm90IHN1cHBvcnQgdGhlIDxjb2RlPnJlbW92ZSgpPC9jb2RlPgotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIExvYWQgbmV4dCB3aXRoIHRoZSBuZXh0IHZhbGlkIGVudHJ5IGZyb20gdGhlIG5lc3RlZAotCSAqIGl0ZXJhdG9yLiBJZiB0aGVyZSBhcmUgbm9uZSwgbmV4dCBpcyBzZXQgdG8gPGNvZGU+RU5EPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5leHQoKSB7Ci0JCXRoaXMuZG9uZSA9IHRydWU7Ci0JCXdoaWxlICh0aGlzLml0ZXJhdG9yLmhhc05leHQoKSAmJiAodGhpcy5kb25lKSkgewotCQkJRTEgdGVtcCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMuYWNjZXB0KHRlbXApKSB7Ci0JCQkJLy8gYXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdCB3YXMgYWNjZXB0ZWQgaXQgaXMgb2YgdHlwZSBFCi0JCQkJdGhpcy5uZXh0ID0gdGhpcy5jYXN0KHRlbXApOwotCQkJCXRoaXMuZG9uZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLm5leHQgPSBudWxsOwotCQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBoYXZlIHRvIGFzc3VtZSB0aGUgZmlsdGVyIHdpbGwgb25seSAiYWNjZXB0IiBvYmplY3RzIHRoYXQgY2FuCi0JICogYmUgY2FzdCB0byBFMi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEUyIGNhc3QoRTEgbykgewotCQlyZXR1cm4gKEUyKSBvOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB7QGxpbmsgRmlsdGVyaW5nSXRlcmF0b3J9Ci0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgI25leHQoKX0gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChFMSBvKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlci5hY2NlcHQobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR2VuZXJpY0l0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjM0M2QwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR2VuZXJpY0l0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgPGNvZGU+RTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50byBhbgotICogaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIHNpbmNlIHRoZXJlCi0gKiBpcyBubyB3YXkgdG8gYWRkIGludmFsaWQgZWxlbWVudHMgdG8gdGhlIGl0ZXJhdG9yJ3MgYmFja2luZyBjb2xsZWN0aW9uLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0l0ZXJhdG9yV3JhcHBlcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCi0JcHVibGljIEdlbmVyaWNJdGVyYXRvcldyYXBwZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR2VuZXJpY0xpc3RJdGVyYXRvcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR2VuZXJpY0xpc3RJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwMGVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgPGNvZGU+RTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50byBhCi0gKiBsaXN0IGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGUKLSAqIHJlc3VsdGluZyBsaXN0IGl0ZXJhdG9yIGRpc2FibGVzIHRoZSBtZXRob2RzIHRoYXQgd291bGQgcHV0IGludmFsaWQgZWxlbWVudHMKLSAqIGluIHRoZSBpdGVyYXRvcidzIGJhY2tpbmcgbGlzdCAoaS5lLiB7QGxpbmsgI3NldChFKX0gYW5kIHtAbGluayAjYWRkKEUpfSkuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljTGlzdEl0ZXJhdG9yV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcjsKLQotCi0JcHVibGljIEdlbmVyaWNMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0xpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOWE4ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IGlzIHNpbWlsYXIgdG8gYSB7QGxpbmsgVHJlZUl0ZXJhdG9yfQotICogZXhjZXB0IHRoYXQgaXQgY2Fubm90IGJlIGFzc3VtZWQgdGhhdCBhbGwgbm9kZXMgYXNzdW1lIGEgc3RyaWN0IHRyZWUKLSAqIHN0cnVjdHVyZS4gRm9yIGluc3RhbmNlLCBpbiBhIHRyZWUsIGEgbm9kZSBjYW5ub3QgYmUgYSBkZXNjZW5kZW50IG9mCi0gKiBpdHNlbGYsIGJ1dCBhIGdyYXBoIG1heSBoYXZlIGEgY3ljbGljYWwgc3RydWN0dXJlLgotICogCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiBncmFwaCBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0IGNvbGxlY3Rpb24gb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLAotICogKG9yIDxlbT5uZWlnaGJvcnM8L2VtPiksIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvcgotICogZ2V0dGluZyA8ZW0+YWxsPC9lbT4gb2YgdGhlIG5vZGVzIGluIHRoZSBncmFwaC4KLSAqIChlLmcuIGEgbmVpZ2hib3IgY2FuIHJldHVybiBoaXMgbmVpZ2hib3JzLCBhbmQgdGhvc2UgbmVpZ2hib3JzCi0gKiBjYW4gcmV0dXJuIHRoZWlyIG5laWdoYm9ycywgd2hpY2ggbWlnaHQgYWxzbyBpbmNsdWRlIHRoZSBvcmlnaW5hbAotICogbmVpZ2hib3IsIGJ1dCB5b3Ugb25seSB3YW50IHRvIHZpc2l0IHRoZSBvcmlnaW5hbCBuZWlnaGJvciBvbmNlLikKLSAqIDxwPgotICogSWYgYSBuZWlnaGJvciBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgKGRldGVybWluZWQgYnkgdXNpbmcgCi0gKiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgPGVtPmNvbXBsZXRlPC9lbT4gZ3JhcGguCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSBpbml0aWFsIG5vZGUgb2YgdGhlIGdyYXBoIG9yIGFuIHtAbGluayBJdGVyYXRvcn0KLSAqIG92ZXIgYW4gaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEge0BsaW5rIE1pc3RlclJvZ2Vyc10gdGhhdCB0ZWxscyB3aG8gdGhlIG5laWdoYm9ycyBhcmUKLSAqIG9mIGVhY2ggbm9kZQotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiB7QGxpbmsgI3JlbW92ZSgpfSBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGJlaGF2aW9yLCBpZiAKLSAqIGRlc2lyZWQsIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JLy8gdXNlIGEgTGlua2VkTGlzdCBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgb2ZmIHRoZSBmcm9udCBhbmQgYWRkaW5nIHRvIHRoZSBlbmQKLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PEU+IHZpc2l0ZWROZWlnaGJvcnMgPSBuZXcgSGFzaFNldDxFPigpOwotCXByaXZhdGUgZmluYWwgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VyczsKLQkKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBjdXJyZW50SXRlcmF0b3I7Ci0JCi0JcHJpdmF0ZSBFIG5leHROZWlnaGJvcjsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgTXIuIFJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRS4uLiByb290cykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgTXIuIFJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXRoaXMocm9vdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgTXIuIFJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXRoaXMocm9vdHMsIE1pc3RlclJvZ2Vycy5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPm5laWdoYm9ycyhPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFIHJvb3QpIHsKLQkJdGhpcyhyb290LCBNaXN0ZXJSb2dlcnMuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290IGFuZCBNci4gUm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUgcm9vdCwgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ocm9vdCksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzIGFuZCBNci4gUm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEVbXSByb290cywgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzIGFuZCBNci4gUm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cywgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSByb290czsKLQkJdGhpcy5taXN0ZXJSb2dlcnMgPSBtaXN0ZXJSb2dlcnM7Ci0JCXRoaXMubG9hZE5leHROZWlnaGJvcigpOwotCX0KLQotCS8qKgotCSAqIExvYWQgbmV4dCBuZWlnaGJvciB3aXRoIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGN1cnJlbnQgaXRlcmF0b3IuCi0JICogSWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaGFzIG5vbmUsIGxvYWQgdGhlIG5leHQgaXRlcmF0b3IuCi0JICogSWYgdGhlcmUgYXJlIG5vIG1vcmUsIHRoZSB7QGxpbmsgZG9uZX0gZmxhZyBpcyBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0TmVpZ2hib3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpIHsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHRQb3NzaWJsZU5laWdoYm9yID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMudmlzaXRlZE5laWdoYm9ycy5jb250YWlucyhuZXh0UG9zc2libGVOZWlnaGJvcikpIHsKLQkJCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0TmVpZ2hib3IgPSBuZXh0UG9zc2libGVOZWlnaGJvcjsKLQkJCQl0aGlzLnZpc2l0ZWROZWlnaGJvcnMuYWRkKG5leHRQb3NzaWJsZU5laWdoYm9yKTsKLQkJCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5uZWlnaGJvcnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7ICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpICYmIHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlpZiAoICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgbmV4dCA9IHRoaXMubmV4dE5laWdoYm9yOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pc3RlclJvZ2Vycy5uZWlnaGJvcnMobmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgR3JhcGhJdGVyYXRvcn0gdG8gcmV0cmlldmUKLQkgKiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiBhIG5vZGUgaW4gdGhlIGdyYXBoLgotCSAqICJUaGVzZSBhcmUgdGhlIHBlb3BsZSBpbiB5b3VyIG5laWdoYm9yaG9vZC4uLiIKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1pc3RlclJvZ2VyczxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBuZWlnaGJvcnMoVCBuZXh0KTsKLQkJCi0JCQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlzdGVyUm9nZXJzPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaXN0ZXJSb2dlcnMgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaXN0ZXJSb2dlcnM8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gbmVpZ2hib3JzKFMgbmV4dCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vycy5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBNci4gUm9nZXJzIHVzZWQgd2hlbiB0aGUge0BsaW5rIEdyYXBoSXRlcmF0b3IjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpcyBvdmVycmlkZGVuLiAqLwotCQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlzdGVyUm9nZXJzIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBHcmFwaEl0ZXJhdG9yLm5laWdoYm9ycyhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDVhN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5QZWVrYWJsZUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0KLSAqIGFuZCBhbGxvd3MgYSB7QGxpbmsgcGVlaygpfSBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgcGVla2FibGUgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIHByZS1sb2FkZWQgZm9yIHRoZSB7QGxpbmsgI3BlZWsoKX0gbWV0aG9kLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgcGVla2FibGUgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICoge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUuCi0JICovCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwgdG8gdGhlCi0JICoge0BsaW5rICNuZXh0KCl9IG1ldGhvZCwgd2l0aG91dCBhZHZhbmNpbmcgcGFzdCBpdC4KLQkgKi8KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHQ7Ci0JfQotCi0JLyoqCi0JICogQmVjYXVzZSB3ZSBuZWVkIHRvIHByZS1sb2FkIHRoZSBuZXh0IGVsZW1lbnQKLQkgKiB0byBiZSByZXR1cm5lZCwgd2UgY2Fubm90IHN1cHBvcnQgdGhlIHtAbGluayAjcmVtb3ZlKCl9Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCB7QGxpbmsgI25leHR9IGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGFuZCB7QGxpbmsgI2RvbmV9IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5leHQoKSB7Ci0JCWlmICh0aGlzLml0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm5leHQgPSBudWxsOwotCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9RdWV1ZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1F1ZXVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhMWZmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1F1ZXVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5RdWV1ZUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYSB7QGxpbmsgUXVldWV9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHF1ZXVlJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgUXVldWUjZGVxdWV1ZSgpIGRlcXVldWV9ZCIgYXMgdGhlIGl0ZXJhdG9yIHJldHVybnMgdGhlbSB3aXRoCi0gKiBjYWxscyB0byB7QGxpbmsgI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUXVldWUKLSAqLwotcHVibGljIGNsYXNzIFF1ZXVlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBRdWV1ZTxFPiBxdWV1ZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlLgotCSAqLwotCXB1YmxpYyBRdWV1ZUl0ZXJhdG9yKFF1ZXVlPEU+IHF1ZXVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLnF1ZXVlLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlyZXR1cm4gdGhpcy5xdWV1ZS5kZXF1ZXVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnF1ZXVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3ODU3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhIGxpc3QKLSAqIG9mIHtAbGluayBMaXN0SXRlcmF0b3J9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHJlYWQtb25seSB7QGxpbmsgTGlzdEl0ZXJhdG9yfS4gQSByZWFkLW9ubHkgY29tcG9zaXRlIGxpc3QKLSAqIGl0ZXJhdG9yIGlzIG1vcmUgZmxleGlibGUgdGhhbiBhIG5vcm1hbCBjb21wb3NpdGUgbGlzdCBpdGVyYXRvciB3aGVuIGl0Ci0gKiBjb21lcyB0byB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUgbmVzdGVkIGl0ZXJhdG9ycy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXh0SXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgbmV4dEluZGV4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgRT4+IGxpc3RzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdDw/IGV4dGVuZHMgRT4sIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGxpc3RzLmxpc3RJdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJCQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mCi0JICogbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCQl0aGlzLm5leHRJbmRleCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPi4uLiBsaXN0cykgewotCQl0aGlzKEFycmF5cy5hc0xpc3QobGlzdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGl0ZXJhdG9ycykpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZE5leHRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLm5leHQoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIGluY3JlbWVudCAnbmV4dEluZGV4JwotCQl0aGlzLm5leHRJbmRleCsrOwotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXg7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5wcmV2aW91cygpOwotCQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gZGVjcmVtZW50ICduZXh0SW5kZXgnCi0JCXRoaXMubmV4dEluZGV4LS07Ci0JCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggIC0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCS8vIHRoZSBsaXN0IGl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIHRoZSBsaXN0IGl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCS8vIHRoZSBsaXN0IGl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHtAbGluayAjbmV4dEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayAjaGFzTmV4dCgpfQotCSAqIG9yIHRoZSBmaW5hbCBpdGVyYXRvciBpZiBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5leHRJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQge0BsaW5rICNuZXh0SXRlcmF0b3J9IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQge0BsaW5rICNoYXNQcmV2aW91cygpfQotCSAqIG9yIHRoZSBmaXJzdCBpdGVyYXRvciBpZiBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFByZXZpb3VzSXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNQcmV2aW91cygpKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB7QGxpbmsgI25leHRJdGVyYXRvcn0gaXMgbnVsbCwgbG9hZCBpdCB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOZXh0SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLm5leHRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTFiNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgcmVtb3ZlcyBzdXBwb3J0IGZvciB7QGxpbmsgI3JlbW92ZSgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKGMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgZGlzYWxsb3cgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjZiM2JhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5TGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBhbmQgcmVtb3ZlcyBzdXBwb3J0IGZvcjo8dWw+Ci0gKiA8bGk+e0BsaW5rICNyZW1vdmUoKX0KLSAqIAk8bGk+e0BsaW5rICNzZXQoT2JqZWN0KX0KLSAqIAk8bGk+e0BsaW5rICNhZGQoT2JqZWN0KX0KLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvciB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY5ZWUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFuIFNRTCB7QGxpbmsgUmVzdWx0U2V0fQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJvd3MgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLSAqIHtAbGluayAjYnVpbGROZXh0KFJlc3VsdFNldCl9IHRvIGJ1aWxkIHRoZSBleHBlY3RlZCBvYmplY3QgZnJvbQotICogdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0LgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGEge0BsaW5rIFJlc3VsdFNldH0KLSAqIDxsaT4gYW4ge0BsaW5rIEFkYXB0ZXJ9IHRoYXQgY29udmVydHMgYSByb3cgaW4gdGhlIHtAbGluayBSZXN1bHRTZXR9Ci0gKiBpbnRvIHRoZSBkZXNpcmVkIG9iamVjdAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2J1aWxkTmV4dChSZXN1bHRTZXQpfSBtZXRob2QpCi0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0U2V0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBSZXN1bHRTZXQgcmVzdWx0U2V0OwotCXByaXZhdGUgZmluYWwgQWRhcHRlcjxFPiBhZGFwdGVyOwotCXByaXZhdGUgRSBuZXh0OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBvYmplY3RzIHByb2R1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCwgQWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzdWx0U2V0ID0gcmVzdWx0U2V0OwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBmaXJzdCBvYmplY3QgaW4gZWFjaCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0JICovCi0JcHVibGljIFJlc3VsdFNldEl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQpIHsKLQkJdGhpcyhyZXN1bHRTZXQsIEFkYXB0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbmV4dCBvYmplY3QgZm9yIHRoZSBpdGVyYXRvciB0byByZXR1cm4uCi0JICogQ2xvc2UgdGhlIHJlc3VsdCBzZXQgd2hlbiB3ZSByZWFjaCB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgRSBidWlsZE5leHQoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5yZXN1bHRTZXQubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROZXh0KHRoaXMucmVzdWx0U2V0KTsKLQkJCX0KLQkJCXRoaXMucmVzdWx0U2V0LmNsb3NlKCk7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93Ci0JICogb2YgdGhlIHJlc3VsdCBzZXQuIEFueSB7QGxpbmsgU1FMRXhjZXB0aW9ufXMgd2lsbAotCSAqIGJlIGNhdWdodCBhbmQgd3JhcHBlZCBpbiBhIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufS4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5idWlsZE5leHQocnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgdGVtcCA9IHRoaXMubmV4dDsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJlc3VsdFNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBSZXN1bHRTZXRJdGVyYXRvcn0gdG8gY29udmVydCBhCi0JICoge0BsaW5rIFJlc3VsdFNldH0ncyBjdXJyZW50IHJvdyBpbnRvIHRoZSBuZXh0IG9iamVjdAotCSAqIHRvIGJlIHJldHVybmVkIGJ5IHRoZSB7QGxpbmsgSXRlcmF0b3J9LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzdWx0IHNldCdzCi0JCSAqICJjdXJyZW50IiByb3cuIEFueSB7QGxpbmsgU1FMRXhjZXB0aW9ufXMgd2lsbAotCQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0uCi0JCSAqIEBzZWUgamF2YS5zcWwuUmVzdWx0U2V0Ci0JCSAqLwotCQlUIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb247Ci0KLQotCQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgQWRhcHRlcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IEFkYXB0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY3VycmVudCByb3cgb2YgdGhlIHJlc3VsdCBzZXQKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIFMgYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJLy8gcmVzdWx0IHNldCBjb2x1bW5zIGFyZSBpbmRleGVkIHN0YXJ0aW5nIHdpdGggMQotCQkJCXJldHVybiAoUykgcnMuZ2V0T2JqZWN0KDEpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY1MzdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgbmV4dCgpfSwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byB7QGxpbmsgI2hhc05leHQoKX0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihlbGVtZW50KX08Y29kZT4uaXRlcmF0b3IoKTwvY29kZT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmRvbmUgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTkzYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayBuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayAjaGFzTmV4dCgpfS4gTGlrZXdpc2UsIGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICogdG8gYSBjYWxsIHRvIHtAbGluayAjaGFzUHJldmlvdXMoKX0gdW50aWwgYSBjYWxsIHRvIHtAbGluayBuZXh0KCl9LAotICogYXQgd2hpY2ggcG9pbnQgYSBjYWxsIHRvIHtAbGluayBwcmV2aW91cygpfSB3aWxsIHJldHVybiB0aGUKLSAqIHNpbmdsZSBlbGVtZW50LgotICogPHA+Ci0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHJldHVybmVkIGJ5OgotICogCXtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2luZ2xldG9uTGlzdChlbGVtZW50KX08Y29kZT4ubGlzdEl0ZXJhdG9yKCk8L2NvZGU+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuaGFzTmV4dCA9IHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5oYXNOZXh0KSB7Ci0JCQl0aGlzLmhhc05leHQgPSBmYWxzZTsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dCA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05leHQ7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5oYXNOZXh0ID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQgPyAtMSA6IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3RhY2tJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTEwYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhY2tJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogZm9yIGEge0BsaW5rIFN0YWNrfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBzdGFjaydzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFN0YWNrI3BvcCgpIHBvcH1wZWQiIGFzIHRoZSBpdGVyYXRvciByZXR1cm5zIHRoZW0gd2l0aAotICogY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIFN0YWNrCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja0l0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgU3RhY2s8RT4gc3RhY2s7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdGFjay4KLQkgKi8KLQlwdWJsaWMgU3RhY2tJdGVyYXRvcihTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5zdGFjay5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0YWNrKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNWFlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmF0b3IgYW5kIHN5bmNocm9uaXplIGFsbCBpdHMgbWV0aG9kcyBzbyBpdCBjYW4gYmUgc2FmZWx5IHNoYXJlZAotICogYW1vbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIE9iamVjdCBtdXRleCkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCksIG11dGV4KTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRSBuZXh0KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQwNzg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3IgYW5kIHN5bmNocm9uaXplIGFsbCBpdHMgbWV0aG9kcyBzbyBpdCBjYW4gYmUgc2FmZWx5IHNoYXJlZAotICogYW1vbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0PEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgbXV0ZXgpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBFIG5leHQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IG5leHRJbmRleCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgcHJldmlvdXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBwcmV2aW91c0luZGV4KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChFIGUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmxpc3RJdGVyYXRvci5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0KEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLnNldChlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmYyNTJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotCi0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyByZXN1bHRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhdG9yIHJldHVybnMgb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIHRyYW5zZm9ybWVkCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhpdGVyYXRvciwgVHJhbnNmb3JtZXIuRGlzYWJsZWQuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLml0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWM4NjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgTGlzdEl0ZXJhdG9yfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJlc3VsdHMgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gVG8gdXNlLCBzdXBwbHkgYSAKLSAqIHtAbGluayBUcmFuc2Zvcm1lcn0gb3Igc3ViY2xhc3MgPGNvZGU+VHJhbnNmb3JtYXRpb25JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBUaGUgbWV0aG9kcyB7QGxpbmsgI3NldChPYmplY3QpfSBhbmQge0BsaW5rICNhZGQoT2JqZWN0KX0KLSAqIGFyZSBsZWZ0IHVuc3VwcG9ydGVkIGluIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyB0byBiZSB0cmFuc2Zvcm1lZAotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBsaXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXRoaXMobGlzdEl0ZXJhdG9yLCBUcmFuc2Zvcm1lci5EaXNhYmxlZC48RTEsIEUyPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEUxPiBsaXN0LCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmxpc3RJdGVyYXRvci5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgcHJldmlvdXMoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgaXRlcmF0b3IgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUyIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUyIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIEUyIHRyYW5zZm9ybShFMSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMmRlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogdHJlZSBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gKiBub2RlIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvciBnZXR0aW5nIGFsbCB0aGUKLSAqIGRlc2NlbmRhbnRzIChjaGlsZHJlbiwgZ3JhbmRjaGlsZHJlbiwgZXRjLikgb2YgdGhlIGdpdmVuIG5vZGUuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIHRyZWUgb3IsIGlmIHRoZSB0cmVlIGhhcwotICogbXVsdGlwbGUgcm9vdHMsIGFuIHtAbGluayBJdGVyYXRvcn0gb3ZlciB0aGUgc2V0IG9mIHJvb3RzCi0gKiA8bGk+IGEge0BsaW5rIE1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuCi0gKiBvZiBlYWNoIGNoaWxkCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgZmluYWwgTWlkd2lmZTxFPiBtaWR3aWZlOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUuLi4gcm9vdHMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxFPihyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXRoaXMocm9vdHMsIE1pZHdpZmUuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFIHJvb3QpIHsKLQkJdGhpcyhyb290LCBNaWR3aWZlLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290IGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRSByb290LCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHJvb3QpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFW10gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzIGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RzOwotCQkvLyB1c2UgYSBMaW5rZWRMaXN0IHNpbmNlIHdlIHdpbGwgYmUgcHVsbGluZyBvZmYgdGhlIGZyb250IGFuZCBhZGRpbmcgdG8gdGhlIGVuZAotCQl0aGlzLml0ZXJhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oKTsKLQkJdGhpcy5taWR3aWZlID0gbWlkd2lmZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciA6IHRoaXMuaXRlcmF0b3JzKSB7Ci0JCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbnRlcm5hbCgpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBzdHJlYW0gPSB0aGlzLml0ZXJhdG9ycy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SW50ZXJuYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBGZXRjaCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5leHQgbm9kZSBiZWZvcmUgcmV0dXJuaW5nIGl0LgotCSAqLwotCXByaXZhdGUgRSBuZXh0SW50ZXJuYWwoKSB7Ci0JCUUgbmV4dCA9IHRoaXMuY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKLQkJdGhpcy5pdGVyYXRvcnMuYWRkKHRoaXMuY2hpbGRyZW4obmV4dCkpOwotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taWR3aWZlLmNoaWxkcmVuKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIFRyZWVJdGVyYXRvcn0gdG8gcmV0cmlldmUKLQkgKiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIGEgbm9kZSBpbiB0aGUgdHJlZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1pZHdpZmU8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBjaGlsZHJlbihUIG8pOwotCi0KLQkJZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIE1pZHdpZmU8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pZHdpZmUgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaWR3aWZlPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgTnVsbCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmV0dXJuIG5vIG5laWdoYm9ycwotCQkJcHVibGljIEl0ZXJhdG9yPFM+IGNoaWxkcmVuKFMgbmV4dCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUcmVlSXRlcmF0b3IuTWlkd2lmZS5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBtaWR3aWZlIHVzZWQgd2hlbiB0aGUge0BsaW5rIFRyZWVJdGVyYXRvciNjaGlsZHJlbihPYmplY3QpfQotCQkgKiBtZXRob2QgaXMgb3ZlcnJpZGRlbi4KLQkJICovCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaWR3aWZlPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIEl0ZXJhdG9yPFM+IGNoaWxkcmVuKFMgbmV4dCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gVHJlZUl0ZXJhdG9yLmNoaWxkcmVuKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVHJlZUl0ZXJhdG9yLk1pZHdpZmUuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0Fic3RyYWN0TW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTE3MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0Fic3RyYWN0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogUmVhc29uYWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1vZGVsfSBwcm90b2NvbAotICogd2l0aCBudW1lcm91cyBjb252ZW5pZW5jZSBtZXRob2RzLgotICogCi0gKiBAc2VlIENoYW5nZVN1cHBvcnQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIE1vZGVsCi17Ci0JLyoqCi0JICogRGVsZWdhdGUgc3RhdGUvcHJvcGVydHkvY29sbGVjdGlvbi9saXN0L3RyZWUgY2hhbmdlIHN1cHBvcnQgdG8gdGhpcwotCSAqIGhlbHBlciBvYmplY3QuIFRoZSBjaGFuZ2Ugc3VwcG9ydCBvYmplY3QgaXMgImxhemlseS1pbml0aWFsaXplZCI7Ci0JICogc28gaXQgbWF5IGJlIG51bGwuIFRoZSBtZXRob2Qge0BsaW5rICNnZXRDaGFuZ2VTdXBwb3J0KCl9IHdpbGwgaW5pdGlhbGl6ZSB0aGlzCi0JICogZmllbGQgaWYgaXQgaXMgbnVsbC4KLQkgKiAKLQkgKiBOQjogV2UgaW5zdGFudGlhdGUgdGhpcyB3aGVuIHdlIGZpcmUgZXZlbnRzLCBldmVuIHdoZW4gd2UgZG8gbm90IGhhdmUKLQkgKiBhbnkgbGlzdGVuZXJzICh3aGljaCBpcyBiZSBpbXBsaWVkIGlmIHRoaXMgaXMgbnVsbCkuCi0JICogVGhpcyBhbGxvd3MgdGhlIGNoYW5nZSBzdXBwb3J0IHRvIGhhdmUgYmVoYXZpb3IgdGllZCB0byBldmVudHMgZXZlbiB3aGVuCi0JICogd2UgaGF2ZSBubyBsaXN0ZW5lcnMuCi0JICogQHNlZSBDYWxsYmFja0NoYW5nZVN1cHBvcnQjYXNwZWN0Q2hhbmdlZChTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFjY2Vzc29yIHdpbGwgYnVpbGQgdGhlIGNoYW5nZSBzdXBwb3J0IHdoZW4gcmVxdWlyZWQuCi0JICogVGhpcyBvbmx5IGhlbHBzIHJlZHVjZSB0aGUgZm9vdHByaW50IG9mIGEgbW9kZWwgdGhhdCBuZWl0aGVyIGhhcyBhbnkKLQkgKiBsaXN0ZW5lcnMgYWRkZWQgdG8gaXQgbm9yIGV2ZXIgY2hhbmdlcyAoZmlyZXMgYW55IGV2ZW50cykuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDaGFuZ2VTdXBwb3J0IGdldENoYW5nZVN1cHBvcnQoKSB7Ci0JCWlmICh0aGlzLmNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgewotCQkJdGhpcy5jaGFuZ2VTdXBwb3J0ID0gdGhpcy5idWlsZENoYW5nZVN1cHBvcnQoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGFuZ2VTdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gdHdlYWsgdGhlIGNoYW5nZSBzdXBwb3J0IHVzZWQuCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IENoYW5nZVN1cHBvcnQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAodGhpcy5jaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIHRoaXMuY2hhbmdlU3VwcG9ydC5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIHRoaXMuY2hhbmdlU3VwcG9ydC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBpbXBsaWVkIDxjb2RlPm51bGw8L2NvZGU+ICJvbGQiIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIHRoaXMuY2hhbmdlU3VwcG9ydC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1BZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvQ29sbGVjdGlvbihFIGl0ZW0sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9Db2xsZWN0aW9uKGl0ZW0sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihPYmplY3QgaXRlbSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihpdGVtLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb248Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKENvbGxlY3Rpb248RT4gbmV3Q29sbGVjdGlvbiwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihJdGVyYXRvcjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYW55IGxpc3QgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgbGlzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCA8RT4gdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gbmV3SXRlbXMsIExpc3Q8RT4gcmVwbGFjZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCByZXBsYWNlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc01vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IHZvaWQgZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbU1vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDbGVhcmVkKGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSwgbGlzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvTGlzdChFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBFIHJlbW92ZUl0ZW1Gcm9tTGlzdChpbnQgaW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUxpc3QoT2JqZWN0IGl0ZW0sIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtRnJvbUxpc3QoaXRlbSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVJdGVtc0Zyb21MaXN0KGludCBpbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoT2JqZWN0W10gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoQ29sbGVjdGlvbjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IEUgc2V0SXRlbUluTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnNldEl0ZW1Jbkxpc3QoaW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGludCByZXBsYWNlSXRlbUluTGlzdChFIG9sZEl0ZW0sIEUgbmV3SXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlcGxhY2VJdGVtSW5MaXN0KG9sZEl0ZW0sIG5ld0l0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnNldEl0ZW1zSW5MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbXNJbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLm1vdmVJdGVtc0luTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJMaXN0KExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5jbGVhckxpc3QobGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoTGlzdDxFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KEl0ZXJhdG9yPEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCB0cmVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIHRoaXMuY2hhbmdlU3VwcG9ydC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHRyZWUgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgdHJlZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgbm9kZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogPGVtPkRvIG5vdDwvZW0+IHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGZpcmUgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uLAotCSAqIHtAbGluayBDaGFuZ2VTdXBwb3J0fSBhbHJlYWR5IGRvZXMgdGhhdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogPGVtPkRvIG5vdDwvZW0+IHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGZpcmUgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uLAotCSAqIHtAbGluayBDaGFuZ2VTdXBwb3J0fSBhbHJlYWR5IGRvZXMgdGhhdC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgYWZ0ZXIgZmlyaW5nIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGlzIG1ldGhvZAotCSAqIHRvIGRlY2lkZSBpZiBzb21lIG90aGVyLCByZWxhdGVkLCBwaWVjZSBvZiBzdGF0ZSBuZWVkcyB0byBiZSBzeW5jaHJvbml6ZWQKLQkgKiB3aXRoIHRoZSBzdGF0ZSB0aGF0IGp1c3QgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsdGhvdWdoIGNsb25pbmcgbW9kZWxzIGlzIHVzdWFsbHkgbm90IGEgR29vZCBJZGVhLAotCSAqIHdlIHNob3VsZCBhdCBsZWFzdCBzdXBwb3J0IGl0IHByb3Blcmx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2RlbCBjbG9uZSA9IChBYnN0cmFjdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQljbG9uZS5jaGFuZ2VTdXBwb3J0ID0gbnVsbDsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIGUuZy4gPGNvZGU+IkNsYXNzTmFtZVswMEYzRUU0Ml0oYWRkJ2wgaW5mbykiPC9jb2RlPgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJaWYgKHNiLmxlbmd0aCgpID09IGxlbikgewotCQkJc2IuZGVsZXRlQ2hhckF0KGxlbiAtIDEpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgcHVibGljIHNvIG9uZSBtb2RlbCBjYW4gY2FsbCBhIG5lc3RlZCBtb2RlbCdzCi0JICogPGNvZGU+I3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nQnVpbGRlciBzYikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGRvIHNvbWV0aGluZyBhIGJpdCBtb3JlIGhlbHBmdWwKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DYWxsYmFja0NoYW5nZVN1cHBvcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DYWxsYmFja0NoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyYjk2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjaGFuZ2Ugc3VwcG9ydCBjbGFzcyB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgd2hlbmV2ZXIgb25lIG9mIHRoZSBzb3VyY2UncwotICogYXNwZWN0cyBoYXMgY2hhbmdlZC4gT25seSB0aGUgYXNwZWN0IG5hbWUgaXMgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lcjsgbm8KLSAqIGV2ZW50IGlzIGdlbmVyYXRlZC4gVGhpcyBhbGxvd3MgdGhlIGxpc3RlbmVycyB0byBkZWxlZ2F0ZSB0byB0aGUgY2hhbmdlCi0gKiBzdXBwb3J0IG9iamVjdCB2ZXJpZmljYXRpb24gdGhhdCBhbiBhc3BlY3QgYXMgYWN0dWFsbHkgY2hhbmdlZC4gVGhpcyBpcwotICogdXNlZnVsIGZvciBzaW1wbGUgdGhpbmdzIGxpa2Ugc2V0dGluZyBkaXJ0eSBmbGFncywgYmxhbmtldCB2YWxpZGF0aW9uLCBhbmQKLSAqIGJsYW5rZXQgc3ljaHJvbml6YXRpb247IGkuZS4gdGhpbmdzIHRoYXQgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGUgPGVtPm5hbWU8L2VtPgotICogb2YgdGhlIGFzcGVjdCB0aGF0IGNoYW5nZWQgYnV0IG5vdCBzbyBtdWNoIDxlbT5ob3c8L2VtPiB0aGUgYXNwZWN0IGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0NoYW5nZVN1cHBvcnQKLQlleHRlbmRzIENoYW5nZVN1cHBvcnQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCXB1YmxpYyBDYWxsYmFja0NoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzKHNvdXJjZSk7Ci0JCXRoaXMuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBDYWxsYmFja0NoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLmFzcGVjdENoYW5nZWQoYXNwZWN0TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgYW55IGFzcGVjdCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCQkvKioKLQkJICogVGhlIHNwZWNpZmllZCBhc3BlY3QgY2hhbmdlZC4KLQkJICovCi0JCXZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSk7Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVTdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJc3VwZXIuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkXyhjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkXyhjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSwgbGlzdCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQodHJlZU5hbWUsIHBhdGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwYzA4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBTdXBwb3J0IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGltcGxlbWVudG9ycyBvZiB0aGUge0BsaW5rIE1vZGVsfSBpbnRlcmZhY2UuCi0gKiBJdCBwcm92aWRlcyBmb3Igc3RhdGUsIHByb3BlcnR5LCBjb2xsZWN0aW9uLCBsaXN0LCBhbmQgdHJlZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0bwotICogbGlzdGVuZXJzLgotICogPHA+Ci0gKiA8c3Ryb25nPk5CMTo8L3N0cm9uZz4gVGhlcmUgaXMgbG90cyBvZiBjb3B5LW4tcGFzdGUgY29kZSBpbiB0aGlzIGNsYXNzLiBOZWFybHkgYWxsIG9mIHRoaXMgZHVwbGljYXRpb24KLSAqIGlzIGFuIGVmZm9ydCB0byBwcmV2ZW50IHRoZSB1bm5lY2Vzc2FyeSBjcmVhdGlvbiBvZiBuZXcgb2JqZWN0cyAodHlwaWNhbGx5IGV2ZW50Ci0gKiBvYmplY3RzKS4gU2luY2UgbWFueSBldmVudHMgYXJlIGZpcmVkIHdoZW4gdGhlcmUgYXJlIG5vIGxpc3RlbmVycywgd2UgcG9zdHBvbmUKLSAqIHRoZSBjcmVhdGlvbiBvZiBldmVudCBvYmplY3RzIHVudGlsIHdlIGtub3cgd2UgaGF2ZSBpbnRlcmVzdGVkIGxpc3RlbmVycy4KLSAqIE1vc3QgbWV0aG9kcyBoYXZlIHRoZSAibm9uLWR1cGxpY2F0ZWQiIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBib2R5IGNvbW1lbnRlZAotICogb3V0IGF0IHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgbWV0aG9kIGJvZHkuCi0gKiBUaGUgaG9wZSB3YXMgdGhhdCB0aGlzIGNsYXNzIHdvdWxkIHByb3ZlIHRvIGJlIGZhaXJseSBzdGF0aWMgYW5kIHRoZSBkdXBsaWNhdGVkCi0gKiBjb2RlIHdvdWxkIG5vdCBwcm92ZSBvbmVyb3VzOyBidXQgdGhhdCBoYXMgbm90IHByb3ZlbiB0byBiZQotICogdGhlIGNhc2UsIGFzIHdlIGhhdmUgYWRkZWQgc3VwcG9ydCBmb3IgInN0YXRlIiBjaGFuZ2VzLCAiZGlydHkiIG5vdGlmaWNhdGlvbiwKLSAqIGFuZCBjdXN0b20gIm5vdGlmaWVycyIsIHdpdGggbW9yZSB0byBjb21lLCBJJ20gc3VyZS4uLi4gIH5ianYKLSAqIDxwPgotICogPHN0cm9uZz5OQjI6PC9zdHJvbmc+IFRoaXMgY2xhc3Mgd2lsbCBjaGVjayB0byBzZWUgaWYsIGR1cmluZyB0aGUgZmlyaW5nIG9mIGV2ZW50cywgYSBsaXN0ZW5lcgotICogb24gdGhlIG9yaWdpbmFsLCBjbG9uZWQsIGxpc3Qgb2YgbGlzdGVuZXJzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFzdGVyCi0gKiBsaXN0IG9mIGxpc3RlbmVycyA8ZW0+YmVmb3JlPC9lbT4gaXQgaXMgbm90aWZpZWQuIElmIHRoZSBsaXN0ZW5lciBoYXMgYmVlbiByZW1vdmVkCi0gKiAiY29uY3VycmVudGx5IiBpdCB3aWxsIDxlbT5ub3Q8L2VtPiBiZSBub3RpZmllZC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjM6PC9zdHJvbmc+IEFueSBsaXN0ZW5lciB0aGF0IGlzIGFkZGVkIGR1cmluZyB0aGUgZmlyaW5nIG9mIGV2ZW50cyB3aWxsIDxlbT5ub3Q8L2VtPiBiZQotICogYWxzbyBub3RpZmllZC4gVGhpcyBpcyBhIGJpdCBpbmNvbnNpc3RlbnQgd2l0aCBOQjIsIGJ1dCBzZWVtcyByZWFzb25hYmxlCi0gKiBzaW5jZSBhbnkgYWRkZWQgbGlzdGVuZXIgc2hvdWxkIGFscmVhZHkgYmUgaW4gc3luY2ggd2l0aCB0aGUgbW9kZWwuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI0Ojwvc3Ryb25nPiBUaGlzIGNsYXNzIGlzIHNlcmlhbGl6YWJsZSwgYnV0IGl0IHdpbGwgb25seSB3cml0ZSBvdXQgbGlzdGVuZXJzIHRoYXQKLSAqIGFyZSBhbHNvIHNlcmlhbGl6YWJsZSB3aGlsZSBzaWxlbnRseSBsZWF2aW5nIGJlaGluZCBsaXN0ZW5lcnMgdGhhdCBhcmUgbm90LgotICogCi0gKiBAc2VlIE1vZGVsCi0gKiBAc2VlIEFic3RyYWN0TW9kZWwKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZVN1cHBvcnQKLQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgb2JqZWN0IHRvIGJlIHByb3ZpZGVkIGFzIHRoZSAic291cmNlIiBmb3IgYW55IGdlbmVyYXRlZCBldmVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIHNvdXJjZTsKLQotCS8qKiBBc3NvY2lhdGUgYXNwZWN0IG5hbWVzIHRvIGNsYXNzLXNwZWNpZmljIGxpc3RlbmVyIGxpc3RzLiAqLwotCXByaXZhdGUgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjw/PltdIGFzcGVjdExpc3RlbmVyTGlzdFBhaXJzID0gRU1QVFlfQVNQRUNUX0xJU1RFTkVSX0xJU1RfUEFJUl9BUlJBWTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjw/PltdIEVNUFRZX0FTUEVDVF9MSVNURU5FUl9MSVNUX1BBSVJfQVJSQVkgPSBuZXcgQXNwZWN0TGlzdGVuZXJMaXN0UGFpclswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBvZiBjaGFuZ2UgZXZlbnRzLgotCSAqIFRoZSBzb3VyY2UgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kCi0JICogY2FycnlpbmcgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBOZWl0aGVyIHRoZSBhc3BlY3QgbmFtZSBub3IgdGhlIGxpc3RlbmVyIGNhbiBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBhc3BlY3RMaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJaWYgKGFzcGVjdExpc3RlbmVyTGlzdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycywgbmV3IFNpbXBsZUFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4obGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpKTsKLQkJfSBlbHNlIHsKLQkJCWFzcGVjdExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCWlmIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMsIG5ldyBOdWxsQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcikpOwotCQl9IGVsc2UgewotCQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIGFsbCB0aGUKLQkgKiBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBjYXJyeWluZyB0aGUgc3BlY2lmaWVkIGFzcGVjdCBuYW1lLgotCSAqIE5laXRoZXIgdGhlIGFzcGVjdCBuYW1lIG5vciB0aGUgbGlzdGVuZXIgY2FuIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlpZiAoYXNwZWN0TGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVucmVnaXN0ZXJlZCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzcGVjdExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOyAgLy8gbGVhdmUgdGhlIHBhaXIsIGV2ZW4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgZW1wdHk/Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciBhbGwgdGhlIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAobGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVucmVnaXN0ZXJlZCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOyAgLy8gbGVhdmUgdGhlIHBhaXIsIGV2ZW4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgZW1wdHk/Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0ZW5lciBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzIGFuZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKiBUaGUgYXNwZWN0IG5hbWUgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gTGlzdGVuZXJMaXN0PEw+IGdldExpc3RlbmVyTGlzdChDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkvLyBwdXQgaW4gYSBudWxsIGNoZWNrIHRvIHNpbXBsaWZ5IGNhbGxpbmcgY29kZQotCQlpZiAoYXNwZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3RfKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBMaXN0ZW5lckxpc3Q8TD4gZ2V0TGlzdGVuZXJMaXN0KENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0XyhsaXN0ZW5lckNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MgYW5kIGFzcGVjdCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBMaXN0ZW5lckxpc3Q8TD4gZ2V0TGlzdGVuZXJMaXN0XyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlmb3IgKEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8Pz4gcGFpciA6IHRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMpIHsKLQkJCWlmIChwYWlyLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSkpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IChMaXN0ZW5lckxpc3Q8TD4pIHBhaXIubGlzdGVuZXJMaXN0OwotCQkJCXJldHVybiBhc3BlY3RMaXN0ZW5lckxpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MKLQkgKiBhbmQgYXNwZWN0IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlpZiAoKGFzcGVjdExpc3RlbmVyTGlzdCAhPSBudWxsKSAmJiAhIGFzcGVjdExpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiB0aGlzLmhhc0FueUNoYW5nZUxpc3RlbmVycygpOyAgLy8gY2hlY2sgZm9yIGFueSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXJzCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcwotCSAqIGFuZCBhc3BlY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc05vTGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAoKGFzcGVjdExpc3RlbmVyTGlzdCAhPSBudWxsKSAmJiAhIGFzcGVjdExpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGNoZWNrIGZvciBhbnkgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVycyAodW5sZXNzIHRoYXQncyB3aGF0IHdlJ3JlIGFscmVhZHkgZG9pbmcpCi0JCXJldHVybiAobGlzdGVuZXJDbGFzcyA9PSB0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSkgPyBmYWxzZSA6IHRoaXMuaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc05vTGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgcHVycG9zZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHRoYXQgYWRkIG90aGVyIHR5cGVzIG9mIGxpc3RlbmVycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkgKiB0byByZXR1cm4gdGhlIGV4dGVuc2lvbiB0byBDaGFuZ2VMaXN0ZW5lciB0aGF0IGFsc28gZXh0ZW5kcyB3aGF0ZXZlciBuZXcKLQkgKiBsaXN0ZW5lciB0eXBlcyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCA8TCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBDbGFzczxMPiBnZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkgewotCQkvLyBub3Qgc3VyZSB3aHkgSSBuZWVkIHRvIGNhc3QgaGVyZS4uLgotCQlyZXR1cm4gKENsYXNzPEw+KSBDSEFOR0VfTElTVEVORVJfQ0xBU1M7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDaGFuZ2VMaXN0ZW5lcj4gQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBldmVudHMsCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgYXNwZWN0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXIuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lcnMgdGhhdCB3aWxsIGJlCi0JICogbm90aWZpZWQgb2YgYW55IGNoYW5nZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnModGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PENoYW5nZUxpc3RlbmVyPiBnZXRDaGFuZ2VMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChDSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGdldENoYW5nZUxpc3RlbmVycygpIHsKLQkJTGlzdGVuZXJMaXN0PENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSwgbGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUxpc3RlbmVyTGlzdDxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldFN0YXRlQ2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSB0aGUgc3BlY2lmaWVkIHN0YXRlIGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhYmxlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBnZW5lcmljIHN0YXRlIGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBzdGF0ZSBjaGFuZ2UKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLS8vCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQobmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpKTsKLQkJU3RhdGVDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBTdGF0ZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJMaXN0KHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIGdpdmVuIGV2ZW50J3Mgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChldmVudC5nZXRPbGRWYWx1ZSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50J3Mgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIGdpdmVuIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgdGhlIHNhbWU7Ci0JICogdGhpcyBpbmNsdWRlcyB3aGVuIGJvdGggdmFsdWVzIGFyZSBudWxsLiBVc2UgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQKLQkgKiBmb3IgZ2VuZXJhbCBwdXJwb3NlIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhbiBpbnQgYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiBvbGQgYW5kIG5ldyBhcmUgZXF1YWwuCi0JICogPHA+Ci0JICogVGhpcyBpcyBtZXJlbHkgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbW9yZSBnZW5lcmFsCi0JICogZmlyZVByb3BlcnR5Q2hhbmdlIG1ldGhvZCB0aGF0IHRha2VzIE9iamVjdCB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotLy8JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSkpOwotCQlpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBJbnRlZ2VyLnZhbHVlT2Yob2xkVmFsdWUpLCBJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib29sZWFuIGJvdW5kIHByb3BlcnR5IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgb2xkIGFuZCBuZXcgYXJlIGVxdWFsLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbWVyZWx5IGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIG1vcmUgZ2VuZXJhbAotCSAqIGZpcmVQcm9wZXJ0eUNoYW5nZSBtZXRob2QgdGhhdCB0YWtlcyBPYmplY3QgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotLy8JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCQlpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdChjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgYWRkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcykpOwotCQlpZiAoICEgYWRkZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgYWRkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGFkZGVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZGRlZEl0ZW0pKTsKLQotCQlDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIHJlbW92ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKSk7Ci0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSByZW1vdmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocmVtb3ZlZEl0ZW0pKTsKLQotCQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLS8vCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKSk7Ci0KLQkJQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLS8vCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbikpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbVRvQ29sbGVjdGlvbihFIGl0ZW0sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmFkZChpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKG5ldyBBcnJheUl0ZXJhdG9yPEU+KGl0ZW1zKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gaXRlbXMuaGFzTmV4dCgpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbl8oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlDb2xsZWN0aW9uPEU+IGFkZGVkSXRlbXMgPSBudWxsOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlFIGl0ZW0gPSBpdGVtcy5uZXh0KCk7Ci0JCQlpZiAoY29sbGVjdGlvbi5hZGQoaXRlbSkpIHsKLQkJCQlpZiAoYWRkZWRJdGVtcyA9PSBudWxsKSB7Ci0JCQkJCWFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCQkJfQotCQkJCWFkZGVkSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCWlmIChhZGRlZEl0ZW1zICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihPYmplY3QgaXRlbSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24ucmVtb3ZlKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgaXRlbSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiAoICEgY29sbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCAhIGNvbGxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbl8oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBpdGVtcy5oYXNOZXh0KCkKLQkJCQkmJiAoICEgY29sbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlIYXNoQmFnPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZW1zKTsKLQkJcmVtb3ZlZEl0ZW1zLnJldGFpbkFsbChjb2xsZWN0aW9uKTsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gY29sbGVjdGlvbi5yZW1vdmVBbGwocmVtb3ZlZEl0ZW1zKTsKLQotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbl8obmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbl8oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJSGFzaEJhZzw/PiByZXRhaW5lZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlIYXNoQmFnPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwotCQlyZW1vdmVkSXRlbXMucmVtb3ZlQWxsKHJldGFpbmVkSXRlbXMpOwotCQlib29sZWFuIGNoYW5nZWQgPSBjb2xsZWN0aW9uLnJldGFpbkFsbChyZXRhaW5lZEl0ZW1zKTsKLQotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBlbnRpcmUgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb25fKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGNvbGxlY3Rpb24sCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2YgcmVtb3ZlcyBhbmQgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAobmV3Q29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhuZXdDb2xsZWN0aW9uLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbl8obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihJdGVyYXRvcjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoICEgbmV3Q29sbGVjdGlvbi5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb25fKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24pLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbl8oQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbjxFPiByZW1vdmVJdGVtcyA9IG5ldyBIYXNoQmFnPEU+KGNvbGxlY3Rpb24pOwotCQlyZW1vdmVJdGVtcy5yZW1vdmVBbGwobmV3Q29sbGVjdGlvbik7Ci0JCWNoYW5nZWQgfD0gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZUl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0KLQkJQ29sbGVjdGlvbjxFPiBhZGRJdGVtcyA9IG5ldyBIYXNoQmFnPEU+KG5ld0NvbGxlY3Rpb24pOwotCQlhZGRJdGVtcy5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCWNoYW5nZWQgfD0gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihhZGRJdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCi0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUxpc3RlbmVyPiBMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdCBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBsaXN0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PExpc3RDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdENoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGdldExpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVyTGlzdChsaXN0TmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgYWRkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcykpOwotCQlpZiAoICEgYWRkZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIGFkZGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJTGlzdEFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhZGRlZEl0ZW0pKTsKLQotCQlMaXN0QWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgcmVtb3ZlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpKTsKLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8obGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSByZW1vdmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUxpc3RSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZW1vdmVkSXRlbSkpOwotCi0JCUxpc3RSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICgoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgJiYgdGhpcy5lbGVtZW50c0FyZURpZmZlcmVudChldmVudC5nZXROZXdJdGVtcygpLCBldmVudC5nZXRPbGRJdGVtcygpKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSByZXBsYWNlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IG9sZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpKTsKLQkJaWYgKCggISBuZXdJdGVtcy5pc0VtcHR5KCkpICYmIHRoaXMuZWxlbWVudHNBcmVEaWZmZXJlbnQobmV3SXRlbXMsIG9sZEl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSByZXBsYWNlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiBvbGRJdGVtcykgewotCQlMaXN0UmVwbGFjZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIG9sZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3Qgb2xkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ld0l0ZW0pLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9sZEl0ZW0pKTsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG5ld0l0ZW0sIG9sZEl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBpdGVtcyB3ZXJlIHJlcGxhY2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3Qgb2xkSXRlbSkgewotCQlMaXN0UmVwbGFjZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSAhPSBldmVudC5nZXRTb3VyY2VJbmRleCgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkXyhldmVudCk7Ci0JCX0KLQkJLy8gaXQncyB1bmxpa2VseSBidXQgcG9zc2libGUgdGhlIGxpc3QgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBtb3ZlLi4uIChlLmcuIGFueSBtb3ZlcyB3aXRoaW4gWyJmb28iLCAiZm9vIiwgImZvbyJdLi4uKQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGl0ZW1zIHdlcmUgbW92ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKSk7Ci0JCWlmICh0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZF8obGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJfQotCQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4gKGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0uLi4pCi0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogaXRlbXMgd2VyZSBtb3ZlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc01vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3RNb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdE1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotLy8JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKG5ldyBMaXN0Q2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpKTsKLQotCQlMaXN0Q2xlYXJFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotLy8JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKSk7Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGxpc3QpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBsaXN0KTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IHZvaWQgYWRkSXRlbVRvTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJbGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgKGkuZS4gJ3RydWUnKS4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZChPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1Ub0xpc3QoRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5hZGQoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgbGlzdC5zaXplKCkgLSAxLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vIExpc3QjYWRkKE9iamVjdCkgc2hvdWxkIGFsd2F5cyByZXR1cm4gJ3RydWUnLCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhpbmRleCwgQXJyYXlzLmFzTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhpbmRleCwgdGhpcy5jb252ZXJ0VG9MaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0XyhpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5hZGRBbGwoaW5kZXgsIGl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlbXMpOwotCQlpZiAobGlzdC5hZGRBbGwoaW5kZXgsIGFkZGVkSXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyAgJ2l0ZW1zJyBzaG91bGQgbm90IGJlIGVtcHR5LCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKHRoaXMuY29udmVydFRvTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8PyBleHRlbmRzIEU+IGNvbnZlcnRUb0xpc3QoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0PD8+KSA/IChMaXN0PD8gZXh0ZW5kcyBFPikgY29sbGVjdGlvbiA6IG5ldyBBcnJheUxpc3Q8RT4oY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3RfKExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpbnQgaW5kZXggPSBsaXN0LnNpemUoKTsKLQkJaWYgKGxpc3QuYWRkQWxsKGl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoICEgaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3RfKGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3RfKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQXJyYXlMaXN0PEU+IGFkZGVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVtcyk7Ci0JCWludCBpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdC5hZGRBbGwoYWRkZWRJdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwdWJsaWMgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSBpdGVtID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUxpc3QoT2JqZWN0IGl0ZW0sIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihpdGVtKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJbGlzdC5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gcmVtb3ZlSXRlbXNGcm9tTGlzdChpbnQgaW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKGluZGV4LCBsZW5ndGgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVJdGVtc0Zyb21MaXN0XyhpbnQgaW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3Q8RT4gc3ViTGlzdCA9IGxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyBsZW5ndGgpOwotCQlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJcmV0dXJuIHJlbW92ZWRJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmICggISBsaXN0LmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiAoICEgbGlzdC5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5oYXNOZXh0KCkpCi0JCQkJJiYgKCAhIGxpc3QuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdF8oaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0XyhJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCWNoYW5nZWQgfD0gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaXRlbXMubmV4dCgpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmV0YWluQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdF8obGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0XyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdF8oaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3RfKGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3RfKEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlIYXNoQmFnPD8+IHJldGFpbmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCUhhc2hCYWc8Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obGlzdCk7Ci0JCXJlbW92ZWRJdGVtcy5yZW1vdmVBbGwocmV0YWluZWRJdGVtcyk7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QocmVtb3ZlZEl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbS4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IEUgc2V0SXRlbUluTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSBvbGRJdGVtID0gbGlzdC5zZXQoaW5kZXgsIGl0ZW0pOwotCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtLCBvbGRJdGVtKTsKLQkJcmV0dXJuIG9sZEl0ZW07Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0KLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHJlcGxhY2VkIGl0ZW0uCi0JICogUmV0dXJuIC0xIGlmIHRoZSBpdGVtIHdhcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBpbnQgcmVwbGFjZUl0ZW1Jbkxpc3QoRSBvbGRJdGVtLCBFIG5ld0l0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9sZEl0ZW0pOwotCQlpZiAoKGluZGV4ICE9IC0xKSAmJiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRJdGVtLCBuZXdJdGVtKSkgewotCQkJbGlzdC5zZXQoaW5kZXgsIG5ld0l0ZW0pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbXMuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0KGludCBpbmRleCwgRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXRJdGVtc0luTGlzdF8oaW5kZXgsIEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdChpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2V0SXRlbXNJbkxpc3RfKGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0XyhpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgaXRlbXMuc2l6ZSgpKTsKLQkJTGlzdDxFPiBvbGRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCUUgbmV3SXRlbSA9IGl0ZW1zLmdldChpKTsKLQkJCUUgb2xkSXRlbSA9IHN1Ykxpc3Quc2V0KGksIG5ld0l0ZW0pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCArIGksIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQl9Ci0JCXJldHVybiBvbGRJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZQotCSAqIHNwZWNpZmllZCB0YXJnZXQgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIG1vdmVJdGVtc0luTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGl0J3MgdW5saWtlbHkgYnV0IHBvc3NpYmxlIHRoZSBsaXN0IGlzIHVuY2hhbmdlZCBieSB0aGUgbW92ZS4uLiAoZS5nLiBhbnkgbW92ZXMgd2l0aGluIFsiZm9vIiwgImZvbyIsICJmb28iXS4uLikKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIG1vdmVJdGVtSW5MaXN0KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4gKGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0uLi4pCi0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1Nb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGVudGlyZSBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjY2xlYXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsZWFyTGlzdChMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyTGlzdF8oTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJbGlzdC5jbGVhcigpOwotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuZXcgbGlzdCwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiBzZXRzLCByZW1vdmVzLCBhbmQvb3IgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoTGlzdDxFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobmV3TGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdChsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdF8obmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplTGlzdF8obmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuZXcgbGlzdCwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiBzZXRzLCByZW1vdmVzLCBhbmQvb3IgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoSXRlcmF0b3I8RT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCAhIG5ld0xpc3QuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3QobGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3RfKG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUxpc3RfKENvbGxlY3Rpb25Ub29scy5saXN0KG5ld0xpc3QpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdF8oTGlzdDxFPiBuZXdMaXN0LCBMaXN0PEU+IG9sZExpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpbnQgbmV3U2l6ZSA9IG5ld0xpc3Quc2l6ZSgpOwotCQlpbnQgb2xkU2l6ZSA9IG9sZExpc3Quc2l6ZSgpOwotCi0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlpbnQgbWluID0gTWF0aC5taW4obmV3U2l6ZSwgb2xkU2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCUUgbmV3SXRlbSA9IG5ld0xpc3QuZ2V0KGkpOwotCQkJRSBvbGRJdGVtID0gb2xkTGlzdC5zZXQoaSwgbmV3SXRlbSk7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobmV3SXRlbSwgb2xkSXRlbSkpIHsKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpLCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdTaXplID09IG9sZFNpemUpIHsKLQkJCXJldHVybiBjaGFuZ2VkOwotCQl9Ci0KLQkJaWYgKG5ld1NpemUgPCBvbGRTaXplKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKG5ld1NpemUsIG9sZFNpemUgLSBuZXdTaXplLCBvbGRMaXN0LCBsaXN0TmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIG5ld1NpemUgPiBvbGRTaXplCi0JCXRoaXMuYWRkSXRlbXNUb0xpc3RfKG5ld0xpc3Quc3ViTGlzdChvbGRTaXplLCBuZXdTaXplKSwgb2xkTGlzdCwgbGlzdE5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBUcmVlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCB0cmVlLiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHRyZWUgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgdHJlZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxUcmVlQ2hhbmdlTGlzdGVuZXI+IGdldFRyZWVDaGFuZ2VMaXN0ZW5lckxpc3QoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBnZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lckxpc3QodHJlZU5hbWUpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1RyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVOb2RlQWRkZWQobmV3IFRyZWVBZGRFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQkJVHJlZUFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVBZGRFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUFkZEV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotLy8JCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKSk7Ci0KLQkJVHJlZVJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUpIHsKLS8vCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChuZXcgVHJlZUNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lKSk7Ci0KLQkJVHJlZUNsZWFyRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0vLwkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzKSk7Ci0KLQkJVHJlZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgbm9kZXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVzQXJlRGlmZmVyZW50KE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzCi0JICogaW4gdGhlIHNhbWUgb3JkZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIGRvIG5vdCByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc2FtZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGl0ZXJhYmxlMSwgaXRlcmFibGUyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFBhaXIgYW4gYXNwZWN0IG5hbWUgd2l0aCBpdHMgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICovCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi0JewotCQlmaW5hbCBMaXN0ZW5lckxpc3Q8TD4gbGlzdGVuZXJMaXN0OwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUFzcGVjdExpc3RlbmVyTGlzdFBhaXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMPihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyVHlwZSgpID09IGxpc3RlbmVyQ2xhc3M7Ci0JCX0KLQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgbnVsbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0QXNwZWN0TmFtZSgpKTsKLQkJfQotCi0JCWFic3RyYWN0IFN0cmluZyBnZXRBc3BlY3ROYW1lKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQYWlyIGFuIGFzcGVjdCBuYW1lIHdpdGggaXRzIGFzc29jaWF0ZWQgbGlzdGVuZXJzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTaW1wbGVBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCQlleHRlbmRzIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4KLQl7Ci0JCWZpbmFsIFN0cmluZyBhc3BlY3ROYW1lOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCVNpbXBsZUFzcGVjdExpc3RlbmVyTGlzdFBhaXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmIChhc3BlY3ROYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuYXNwZWN0TmFtZSA9IGFzcGVjdE5hbWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmFzcGVjdE5hbWUuZXF1YWxzKGFzcGVjdE5hbWUpCi0JCQkJCSYmIHN1cGVyLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3BlY3ROYW1lOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBQYWlyIGEgbnVsbCBhc3BlY3QgbmFtZSB3aXRoIGl0cyBhc3NvY2lhdGVkIGxpc3RlbmVycy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTnVsbEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JCWV4dGVuZHMgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJTnVsbEFzcGVjdExpc3RlbmVyTGlzdFBhaXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQkJc3VwZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWJvb2xlYW4gbWF0Y2hlcyhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCXJldHVybiAoYXNwZWN0TmFtZSA9PSBudWxsKQotCQkJCQkmJiBzdXBlci5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCVN0cmluZyBnZXRBc3BlY3ROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTg4MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2hhbmdlIHN1cHBvcnQgY2xhc3MgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHN0YW5kYXJkCi0gKiBjaGFuZ2Ugc3VwcG9ydCBpbiBzZXZlcmFsIHdheXM6PHVsPgotICogPGxpPkFsbCBldmVudHMgZmlyZWQgYnkgdGhlIHNvdXJjZSBtdXN0IHNwZWNpZnkgdGhlIHNpbmdsZSBhc3BlY3QuCi0gKiA8bGk+TGlzdGVuZXJzIGFyZSByZXF1aXJlZCB0byBiZSBlaXRoZXIgImdlbmVyYWwgcHVycG9zZSIgbGlzdGVuZXJzIG9yCi0gKiAJICAgIGxpc3RlbmVycyBvZiB0aGUgc2luZ2xlIGFzcGVjdC4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0Ci0JZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2YWxpZExpc3RlbmVyQ2xhc3M7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2YWxpZEFzcGVjdE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydChNb2RlbCBzb3VyY2UsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2YWxpZExpc3RlbmVyQ2xhc3MsIFN0cmluZyB2YWxpZEFzcGVjdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKCAhIHZhbGlkTGlzdGVuZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNoYW5nZSBzdXBwb3J0J3MgY2hhbmdlIGxpc3RlbmVyIGNsYXNzICgiICsgdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkuZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiKSBkb2VzIG5vdCBleHRlbmQgdGhlIHZhbGlkIGxpc3RlbmVyIGNsYXNzOiAiICsgdmFsaWRMaXN0ZW5lckNsYXNzLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcyA9IHZhbGlkTGlzdGVuZXJDbGFzczsKLQkJdGhpcy52YWxpZEFzcGVjdE5hbWUgPSB2YWxpZEFzcGVjdE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYnVpbGRVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLQkJCQkiVGhpcyBNb2RlbCBzdXBwb3J0cyBvbmx5IGNoYW5nZXMgZm9yIHRoZSBsaXN0ZW5lciB0eXBlIFwiIiArIHRoaXMudmFsaWRMaXN0ZW5lckNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJKyAiXCIgYW5kIHRoZSBhc3BlY3QgXCIiICsgdGhpcy52YWxpZEFzcGVjdE5hbWUgKyAnIicgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgY2FuIGJlIGVpdGhlciBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWQgbGlzdGVuZXIgY2xhc3Mgb3IKLQkgKiB0aGUgImdlbmVyYWwtcHVycG9zZSIgY2hhbmdlIGxpc3RlbmVyIGNsYXNzICh3aGljaCBzaG91bGQgZXh0ZW5kIHRoZQotCSAqIHRoZSB2YWxpZCBsaXN0ZW5lciBjbGFzcykuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCWlmICgobGlzdGVuZXJDbGFzcyAhPSB0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSkgJiYgKGxpc3RlbmVyQ2xhc3MgIT0gdGhpcy52YWxpZExpc3RlbmVyQ2xhc3MpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhpcyBNb2RlbCBzdXBwb3J0cyBvbmx5IGNoYW5nZXMgZm9yIHRoZSBsaXN0ZW5lciB0eXBlIFwiIiArIHRoaXMudmFsaWRMaXN0ZW5lckNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlwiIDogXCIiICsgbGlzdGVuZXJDbGFzcy5nZXROYW1lKCkgKyAnIicgLy8kTk9OLU5MUy0xJAotCQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2soQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCWlmICggISBhc3BlY3ROYW1lLmVxdWFscyh0aGlzLnZhbGlkQXNwZWN0TmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGlzIE1vZGVsIHN1cHBvcnRzIG9ubHkgY2hhbmdlcyBmb3IgdGhlIGFzcGVjdCBcIiIgKyB0aGlzLnZhbGlkQXNwZWN0TmFtZSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlwiIDogXCIiICsgYXNwZWN0TmFtZSArICciJyAvLyROT04tTkxTLTEkCi0JCQkJKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCByZXBsYWNlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlSXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUxpc3RDaGFuZ2VkKGxpc3ROYW1lLCBsaXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4OTRkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUuCi0gKiBGb3J3YXJkIDxlbT5ldmVyeTwvZW0+IGV2ZW50IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgVUkgdGhyZWFkIHNvIHRoZSBsaXN0ZW5lcgotICogcmVjZWl2ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGdlbmVyYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0KLQlwdWJsaWMgQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjbGVhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZmluYWwgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlcGxhY2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGZpbmFsIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgcmVtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNsZWFyZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNsZWFyZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjaW52b2tlQW5kV2FpdChSdW5uYWJsZSkgY2FuIHNvbWV0aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRfKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIG5vZGVBZGRlZF8oVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIG5vZGVSZW1vdmVkXyhUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCB0cmVlQ2xlYXJlZF8oVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCB0cmVlQ2hhbmdlZF8oVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMzQyMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUuCi0gKiBGb3J3YXJkIDxlbT5ldmVyeTwvZW0+IGV2ZW50IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgVUkgdGhyZWFkIHNvIHRoZSBsaXN0ZW5lcgotICogcmVjZWl2ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGdlbmVyYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjaW52b2tlQW5kV2FpdChSdW5uYWJsZSkgY2FuIHNvbWV0aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkXyhDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkXyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5YzUzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUuCi0gKiBGb3J3YXJkIDxlbT5ldmVyeTwvZW0+IGV2ZW50IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgVUkgdGhyZWFkIHNvIHRoZSBsaXN0ZW5lcgotICogcmVjZWl2ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGdlbmVyYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZExpc3RDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKSBjYW4gc29tZXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NTYzODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLgotICogRm9yd2FyZCA8ZW0+ZXZlcnk8L2VtPiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCi0JcHVibGljIEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKSBjYW4gc29tZXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODlkYzlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZS4KLSAqIEZvcndhcmQgPGVtPmV2ZXJ5PC9lbT4gZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCi0gKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcgI2ludm9rZUFuZFdhaXQoUnVubmFibGUpIGNhbiBzb21ldGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgc3RhdGVDaGFuZ2VkXyhTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDgxNmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLgotICogRm9yd2FyZCA8ZW0+ZXZlcnk8L2VtPiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKLSAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlQWRkZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjaW52b2tlQW5kV2FpdChSdW5uYWJsZSkgY2FuIHNvbWV0aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczN2VlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgY29sbGVjdGlvbiBjaGFuZ2UKLSAqIGV2ZW50cy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoY29sbGVjdGlvbk5hbWUuZXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lLmVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBjb2xsZWN0aW9uIHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBjb2xsZWN0aW9uIHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0TGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllZTI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgbGlzdCBjaGFuZ2UKLSAqIGV2ZW50cy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0TmFtZS5lcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYW55IGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEVuZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbCgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ZWZlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydHkgY2hhbmdlCi0gKiBldmVudHMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHByb3BlcnR5IHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBwcm9wZXJ0eSB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlTW9kZWwoKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWQxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ojx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IG1vZGVsCi0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbF8oKX08cD4KLSAqICAgICB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGFkYXB0ZWQgbW9kZWwKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZU1vZGVsXygpfTxwPgotICogICAgIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhZGFwdGVkIG1vZGVsCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI3Byb3BlcnR5Q2hhbmdlZCgpfSB3aGVuZXZlciB0aGUgY2FsY3VsYXRlZAotICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNoYW5nZXMgKGFzIGRldGVybWluZWQgYnkgdGhlIHN1YmNsYXNzKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IHZhbHVlIHNvIHdlIGNhbiBwYXNzIGFuICJvbGQgdmFsdWUiIHdoZW4KLQkgKiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkgYmUgY2FsY3VsYXRlZCBhbmQgd2UgbWF5Ci0JICogbm90IGFibGUgdG8gZGVyaXZlIHRoZSAib2xkIHZhbHVlIiBmcm9tIGFueSBmaXJlZCBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gb3VyIHZhbHVlIGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbW9kZWwKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwgYW5kIGJ1aWxkIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5lbmdhZ2VNb2RlbF8oKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uLAotCQkvLyBzaW5jZSB0aGUgY29sbGVjdGlvbidzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlTW9kZWxfKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0JICogY3VycmVudCBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgViBidWlsZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwgYW5kIGNsZWFyIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VNb2RlbF8oKTsKLQkJLy8gY2xlYXIgb3V0IG91ciB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKTsKLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGNoYW5nZWQgaW4gc29tZSBmYXNoaW9uLgotCSAqIFJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgbm90aWZ5IGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy52YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjMmUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVOb2RlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBTdWJjbGFzc2VzIG5lZWQgb25seSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogCi0gKiAjdmFsdWUoKQotICoJICAgIHJldHVybiB0aGUgdXNlci1kZXRlcm1pbmVkICJ2YWx1ZSIgb2YgdGhlIG5vZGUsCi0gKiAgICAgaS5lLiB0aGUgb2JqZWN0ICJ3cmFwcGVkIiBieSB0aGUgbm9kZQotICogCi0gKiAjc2V0VmFsdWUoT2JqZWN0KQotICogICAgIHNldCB0aGUgdXNlci1kZXRlcm1pbmVkICJ2YWx1ZSIgb2YgdGhlIG5vZGUsCi0gKiAgICAgaS5lLiB0aGUgb2JqZWN0ICJ3cmFwcGVkIiBieSB0aGUgbm9kZTsKLSAqICAgICB0eXBpY2FsbHkgb25seSBvdmVycmlkZGVuIGZvciBub2RlcyB3aXRoICJwcmltaXRpdmUiIHZhbHVlcwotICogCi0gKiAjcGFyZW50KCkKLSAqICAgICByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgbm9kZSwgd2hpY2ggc2hvdWxkIGJlIGFub3RoZXIKLSAqICAgICBUcmVlTm9kZVZhbHVlTW9kZWwKLSAqIAotICogI2NoaWxkcmVuTW9kZWwoKQotICogICAgIHJldHVybiBhIExpc3RWYWx1ZU1vZGVsIGZvciB0aGUgbm9kZSdzIGNoaWxkcmVuCi0gKiAKLSAqICNlbmdhZ2VWYWx1ZSgpIGFuZCAjZGlzZW5nYWdlVmFsdWUoKQotICogICAgIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgdG8gbGlzdGVuIHRvIHRoZSBub2RlJ3MgdmFsdWUgaWYKLSAqICAgICBpdCBjYW4gY2hhbmdlIGluIGEgd2F5IHRoYXQgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgdHJlZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFRyZWVOb2RlVmFsdWVNb2RlbDxUPgotewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJLy8gdGhpcyBtb2RlbCBmaXJlcyAqYm90aCogInZhbHVlIHByb3BlcnR5IGNoYW5nZSIgYW5kICJzdGF0ZSBjaGFuZ2UiIGV2ZW50cy4uLgotLy8JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlyZXR1cm4gc3VwZXIuYnVpbGRDaGFuZ2VTdXBwb3J0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENsaWVudHMgc2hvdWxkIGJlIGFkZGluZyBib3RoICJzdGF0ZSBjaGFuZ2UiIGFuZCAidmFsdWUgcHJvcGVydHkgY2hhbmdlIgotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JCX0KLQkJc3VwZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBub2RlJ3MgdmFsdWUncyBzdGF0ZS4gSWYgdGhlIHN0YXRlIG9mIHRoZSBub2RlIGNoYW5nZXMKLQkgKiBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHRyZWUsIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZSgpOwotCi0JLyoqCi0JICogQHNlZSAjYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSdzIHZhbHVlLgotCSAqIEBzZWUgI2VuZ2FnZVZhbHVlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpOwotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcGF0aCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdCh0aGlzLmJhY2tQYXRoKCkpOwotCQlyZXR1cm4gcGF0aC50b0FycmF5KG5ldyBUcmVlTm9kZVZhbHVlTW9kZWxbcGF0aC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCBjbGltYnMgdXAgdGhlIG5vZGUncyBwYXRoLAotCSAqIHN0YXJ0aW5nIHdpdGgsIGFuZCBpbmNsdWRpbmcsIHRoZSBub2RlCi0JICogYW5kIHVwIHRvLCBhbmQgaW5jbHVkaW5nLCB0aGUgcm9vdCBub2RlLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGJhY2tQYXRoKCkgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pih0aGlzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbmV4dExpbmsoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLnBhcmVudCgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWwoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZkNoaWxkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZCkgewotCQlMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbk1vZGVsKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLmdldChpKSA9PSBjaGlsZCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWwoKS5zaXplKCkgPT0gMDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBpbXBsZW1lbnQgI2VxdWFscyhPYmplY3QpIHNvIHRoYXQgVHJlZVBhdGhzIGNvbnRhaW5pbmcgdGhlc2Ugbm9kZXMKLQkgKiB3aWxsIHJlc29sdmUgcHJvcGVybHkgd2hlbiB0aGUgbm9kZXMgY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMuIFRoaXMgaXMKLQkgKiBuZWNlc3NhcnkgYmVjYXVzZSBub2RlcyBhcmUgZHJvcHBlZCBhbmQgcmVidWlsdCB3aWxseS1uaWxseSB3aGVuIGRlYWxpbmcKLQkgKiB3aXRoIGEgc29ydGVkIGxpc3Qgb2YgY2hpbGRyZW47IGFuZCB0aGlzIGFsbG93cyB1cyB0byBzYXZlIGFuZCByZXN0b3JlCi0JICogYSB0cmVlJ3MgZXhwYW5kZWQgcGF0aHMuIFRoZSBub2RlcyBpbiB0aGUgZXhwYW5kZWQgcGF0aHMgdGhhdCBhcmUKLQkgKiBzYXZlZCBiZWZvcmUgYW55IG1vZGlmaWNhdGlvbiAoZS5nLiByZW5hbWluZyBhIG5vZGUpIHdpbGwgYmUgZGlmZmVyZW50Ci0JICogZnJvbSB0aGUgbm9kZXMgaW4gdGhlIHRyZWUncyBwYXRocyBhZnRlciB0aGUgbW9kaWZpY2F0aW9uLCBpZiB0aGUgbW9kaWZpY2F0aW9uCi0JICogcmVzdWx0cyBpbiBhIHBvc3NpYmxlIGNoYW5nZSBpbiB0aGUgbm9kZSBzb3J0IG9yZGVyLiAgfmJqdgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG8uZ2V0Q2xhc3MoKSAhPSB0aGlzLmdldENsYXNzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8VD4gb3RoZXIgPSAoQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG87Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTBiMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgZXh0ZW5zaW9uIG9mIHtAbGluayBBYnN0cmFjdE1vZGVsfSBwcm92aWRlcyBhIGJhc2UgZm9yIGFkZGluZyAKLSAqIGNoYW5nZSBsaXN0ZW5lcnMgKHByb3BlcnR5IGNoYW5nZSwgY29sbGVjdGlvbiBjaGFuZ2UsIGxpc3QgY2hhbmdlLCB0cmVlIGNoYW5nZSkKLSAqIHRvIGEgc3ViamVjdCBhbmQgY29udmVydGluZyB0aGUgc3ViamVjdCdzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gYSBzaW5nbGUKLSAqIHNldCBvZiBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBmb3IgYSBjb21tb24gYXNwZWN0IChlLmcuIDxjb2RlPlZBTFVFPC9jb2RlPikuCi0gKiA8cD4KLSAqIFRoZSBhZGFwdGVyIHdpbGwgb25seSBsaXN0ZW4gdG8gdGhlIHN1YmplY3QgKGFuZCBzdWJqZWN0IGhvbGRlcikgd2hlbiB0aGUKLSAqIGFkYXB0ZXIgaXRzZWxmIGFjdHVhbGx5IGhhcyBsaXN0ZW5lcnMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgYWRhcHRlciB0byBiZQotICogZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBhcHByb3ByaWF0ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0QWRhcHRlcjxTPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCS8qKgotCSAqIFRoZSBzdWJqZWN0IHRoYXQgaG9sZHMgdGhlIGFzcGVjdCBhbmQgZmlyZXMKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIHdoZW4gdGhlIGFzcGVjdCBjaGFuZ2VzLgotCSAqIFdlIG5lZWQgdG8gaG9sZCBvbiB0byB0aGlzIGRpcmVjdGx5IHNvIHdlIGNhbgotCSAqIGRpc2VuZ2FnZSBpdCB3aGVuIGl0IGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIFMgc3ViamVjdDsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgdGhhdCBob2xkcyB0aGUgc3ViamVjdAotCSAqIHRoYXQgaG9sZHMgdGhlIGFzcGVjdCBhbmQgcHJvdmlkZXMgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhc3BlY3QgYWRhcHRlcnMKLQkgKiB0aGF0IGhhdmUgdGhlIHNhbWUgc3ViamVjdCBhbmQgdGhhdCBzdWJqZWN0IGNhbiBjaGFuZ2UuCi0JICogQWxsIHRoZSBhc3BlY3QgYWRhcHRlcnMgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIHN1YmplY3QgaG9sZGVyLgotCSAqIEZvciBub3csIHRoaXMgaXMgY2FuIG9ubHkgYmUgc2V0IHVwb24gY29uc3RydWN0aW9uIGFuZCBpcwotCSAqIGltbXV0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBrZWVwcyB1cyBpbiBzeW5jaCB3aXRoIHRoZSBzdWJqZWN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RBZGFwdGVyKFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlci4KLQkgKiBUaGUgc3ViamVjdCBob2xkZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdWJqZWN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IHN1YmplY3RIb2xkZXI7Ci0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyB0aGUgc3ViamVjdCBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gaXQKLQkJLy8gdGhpcyB3aWxsIHR5cGljYWxseSByZXN1bHQgaW4gb3VyIHZhbHVlIGJlaW5nIG51bGwKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ2hhbmdlU3VwcG9ydCh0aGlzLCB0aGlzLmdldExpc3RlbmVyQ2xhc3MoKSwgdGhpcy5nZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaG9sZGVyJ3MgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgb3VyIHN1YmplY3QgaW4gc3luY2guCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdWJqZWN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQuIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGRWYWx1ZSwgdGhpcy5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIGxpc3RlbmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3MgYXNwZWN0IChlLmcuIFZBTFVFKS4KLQkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYWRhcHRlcidzIHNpbmdsZSBhc3BlY3QsIG5vdCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0IHRoZSBhc3BlY3QgYWRhcHRlciBpcyBhZGFwdGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0KCkgewotCQkvLyBjaGVjayBmb3Igbm90aGluZyB0byBsaXN0ZW4gdG8KLQkJaWYgKHRoaXMuc3ViamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZ2FnZVN1YmplY3RfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIGFkZCBvdXIgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlU3ViamVjdF8oKTsKLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3QoKSB7Ci0JCS8vIGNoZWNrIGZvciBub3RoaW5nIHRvIGxpc3RlbiB0bwotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBzdWJqZWN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgc3ViamVjdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIGl0cyBob2xkZXIKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbHMoKSB7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCQl0aGlzLmVuZ2FnZVN1YmplY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbHMoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdCgpOwotCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9jYWwgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIGNoYW5nZSBzdXBwb3J0IHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIG1vZGVscyAodGhlIHN1YmplY3QgaG9sZGVyIGFuZCB0aGUgc3ViamVjdCBpdHNlbGYpIHdoZW4gdGhlIGZpcnN0Ci0JICogcmVsZXZhbnQgbGlzdGVuZXIgaXMgYWRkZWQuCi0JICogQ29udmVyc2VseSwgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFzcGVjdCBhZGFwdGVyJ3MgbW9kZWxzIHdoZW4gdGhlCi0JICogbGFzdCByZWxldmFudCBsaXN0ZW5lciBpcyByZW1vdmVkLgotCSAqIEEgcmVsZXZhbnQgbGlzdGVuZXIgaXMgYSBsaXN0ZW5lciBvZiB0aGUgcmVsZXZhbnQgdHlwZSBhbmQgYXNwZWN0IG9yIGEKLQkgKiBnZW5lcmFsLXB1cnBvc2UgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsQ2hhbmdlU3VwcG9ydCBleHRlbmRzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgTG9jYWxDaGFuZ2VTdXBwb3J0KEFzcGVjdEFkYXB0ZXI8Uz4gc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzLCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lKSB7Ci0JCQlzdXBlcihzb3VyY2UsIHZhbGlkTGlzdGVuZXJDbGFzcywgdmFsaWRBc3BlY3ROYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzTm9MaXN0ZW5lcnModGhpcy52YWxpZExpc3RlbmVyQ2xhc3MsIHRoaXMudmFsaWRBc3BlY3ROYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZGlzZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZGlzZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc2YTU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRVN9IGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgdG8gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgZnJvbSB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZ2V0SXRlcmFibGUoKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUKLSAqICAgICBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3Q7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZiBlaXRoZXIKLSAqICAgICB7QGxpbmsgI2l0ZXJhdG9yXygpfSBvciB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjc2l6ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjaXRlcmF0b3JfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZQotICogICAgIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdCBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0SXRlcmFibGUoKX07Ci0gKiAgICAgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICNpdGVyYXRvcigpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjaXRlcmF0b3IoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvciB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDxsaT57QGxpbmsgI3NpemUoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhIHplcm8gd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8L3VsPgotICogVG8gbm90aWZ5IGxpc3RlbmVycywgc3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI2NvbGxlY3Rpb25DaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gRW1wdHlJdGVyYXRvci48RT5pbnN0YW5jZSgpIDogdGhpcy5pdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNpdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2l0ZXJhdG9yXygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZXJhYmxlKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IDAgOiB0aGlzLnNpemVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uID0gKENvbGxlY3Rpb248RT4pIG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIG5ld0NvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODA0ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgbGlzdCBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNMSVNUX1ZBTFVFU30gbGlzdC4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3JfKCl9PHA+Ci0gKiAgICAgYXQgdGhlIHZlcnkgbWluaW11bSwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgbGlzdCBpdGVyYXRvcgotICogICAgIG9uIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3Q7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjbGlzdEl0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNnZXQoaW50KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjc2l6ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjdG9BcnJheV8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI3RvQXJyYXkoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcigpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGxpc3QgaXRlcmF0b3Igd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8bGk+e0BsaW5rICNzaXplKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYSB6ZXJvIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjdG9BcnJheSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICNsaXN0Q2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgYWRhcHRlciBmb3IgYW4gYXNwZWN0IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLmxpc3RJdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNsaXN0SXRlcmF0b3IoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmdldCh0aGlzLmxpc3RJdGVyYXRvcigpLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0ID09IG51bGwgPyAwIDogdGhpcy5zaXplXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjc2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QgPT0gbnVsbCA/IEVNUFRZX0FSUkFZIDogdGhpcy50b0FycmF5XygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICN0b0FycmF5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gdG9BcnJheV8oKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KHRoaXMubGlzdEl0ZXJhdG9yKCksIHRoaXMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxFPiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBMSVNUX1ZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0PEU+IG5ld0xpc3QgPSAoTGlzdDxFPikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCBuZXdMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRWYWx1ZUxpc3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8RT4gYnVpbGRWYWx1ZUxpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRWYWx1ZUxpc3QoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjMDUzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFfSBwcm9wZXJ0eS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0gKiAgICAgc3ViamVjdCdzIGFzcGVjdCAob3IgInZpcnR1YWwiIGFzcGVjdCk7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUKLSAqICAgICBvdmVycmlkZGVuIGlmIHtAbGluayAjYnVpbGRWYWx1ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIGNsaWVudCBjb2RlIG5lZWRzIHRvIDxlbT5zZXQ8L2VtPiB0aGUgdmFsdWUgb2YKLSAqICAgICB0aGUgc3ViamVjdCdzIGFzcGVjdDsgb2Z0ZW50aW1lcywgdGhvdWdoLCB0aGUgY2xpZW50IGNvZGUgKGUuZy4gVUkpCi0gKiAgICAgd2lsbCBuZWVkIG9ubHkgdG8gPGVtPmdldDwvZW0+IHRoZSB2YWx1ZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZQotICogICAgIG92ZXJyaWRkZW4gaWYge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgd2hlbgotICogICAgIHRoZSBzdWJqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2V0VmFsdWUoT2JqZWN0KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHNvbWV0aGluZyBtdXN0IGJlIGRvbmUgd2hlbiB0aGUgc3ViamVjdAotICogICAgIGlzIDxjb2RlPm51bGw8L2NvZGU+IChlLmcuIHRocm93IGFuIGV4Y2VwdGlvbikKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjcHJvcGVydHlDaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxTLCBWPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXNwZWN0IHNvIHdlCi0JICogY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkgYmUgY2FsY3VsYXRlZCBhbmQgbWF5Ci0JICogbm90IGJlIGluIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIHN1YmplY3QsCi0JICogZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBtdWx0aXBsZSBhc3BlY3RzLgotCSAqLwotCXByb3RlY3RlZCBWIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzZXRWYWx1ZShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBWIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUU7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhWQUxVRSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3QoKSB7Ci0JCXN1cGVyLmVuZ2FnZVN1YmplY3QoKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlU3ViamVjdCgpOwotCQkvLyBjbGVhciBvdXQgb3VyIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgViBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2J1aWxkVmFsdWUoKQotCSAqLwotCXByb3RlY3RlZCBWIGJ1aWxkVmFsdWVfKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSBzdWJjbGFzc2VzIHdoZW5ldmVyIHRoZSBzdWJqZWN0J3MgYXNwZWN0Ci0JICogaGFzIGNoYW5nZWQ7IGxpc3RlbmVycyB3aWxsIGJlIG5vdGlmaWVkIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTVhYTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgdHJlZSBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNOT0RFU30gdHJlZS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNub2Rlc18oKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmF0b3IKLSAqICAgICBvbiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI25vZGVzKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNub2RlcygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICN0cmVlQ2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgdmFsdWUgbW9kZWwgYWRhcHRlciBmb3IgYW4gYXNwZWN0IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGVzIG9mIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMubm9kZXNfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlcyBvZiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjbm9kZXMoKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBub2Rlc18oKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFRyZWVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIE5PREVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhOT0RFUyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENvbGxlY3Rpb248RT4gbmV3Tm9kZXMgPSAoQ29sbGVjdGlvbjxFPikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTLCBuZXdOb2Rlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTLCB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IGJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5ub2RlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzdmYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSB2YWx1ZQotICogaW4gYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCAodGhlICJ3cmFwcGVkIiB2YWx1ZSBob2xkZXIpLiBUaGUgYXBwbGljYXRpb24KLSAqIGNhbiBtb2RpZnkgdGhpcyB0ZW1wb3JhcnkgY29weSwgYWQgbmF1c2VhbTsgYnV0IHRoZSB0ZW1wb3JhcnkgY29weSBpcyBvbmx5Ci0gKiBwYXNzZWQgdGhyb3VnaCB0byB0aGUgIndyYXBwZWQiIHZhbHVlIGhvbGRlciB3aGVuIHRoZSB0cmlnZ2VyICJhY2NlcHRzIiB0aGUKLSAqIGJ1ZmZlcmVkIHZhbHVlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgYXBwbGljYXRpb24gY2FuICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0gKiB0byB0aGUgb3JpZ2luYWwsICJ3cmFwcGVkIiB2YWx1ZS4KLSAqIDxwPgotICogVGhlIHRyaWdnZXIgaXMgYW5vdGhlciB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGhvbGRzIGEge0BsaW5rIEJvb2xlYW59Ci0gKiBhbmQgdGhlIGFwcGxpY2F0aW9uIGNoYW5nZXMgdGhlIHRyaWdnZXIncyB2YWx1ZSB0byB0cnVlIG9uICJhY2NlcHQiLCBmYWxzZSBvbiAicmVzZXQiLgotICogVHlwaWNhbGx5LCBpbiBhIGRpYWxvZzo8dWw+Ci0gKiA8bGk+cHJlc3NpbmcgdGhlICJPSyIgYnV0dG9uIHdpbGwgdHJpZ2dlciBhbiAiYWNjZXB0IiBhbmQgY2xvc2UgdGhlIGRpYWxvZwotICogPGxpPnByZXNzaW5nIHRoZSAiQ2FuY2VsIiBidXR0b24gd2lsbCBzaW1wbHkgY2xvc2UgdGhlIGRpYWxvZywKLSAqICAgZHJvcHBpbmcgdGhlICJidWZmZXJlZCIgdmFsdWVzIGludG8gdGhlIGJpdCBidWNrZXQKLSAqIDxsaT5wcmVzc2luZyB0aGUgIkFwcGx5IiBidXR0b24gd2lsbCB0cmlnZ2VyIGFuICJhY2NlcHQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIDxsaT5wcmVzc2luZyB0aGUgIlJlc3RvcmUiIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYSAicmVzZXQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEEgbnVtYmVyIG9mIGJ1ZmZlcmVkIHByb3BlcnR5IHZhbHVlIG1vZGVscyBjYW4gd3JhcCBhbm90aGVyIHNldCBvZgotICogcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXJzIHRoYXQgYWRhcHQgdGhlIHZhcmlvdXMgYXNwZWN0cyBvZiBhIHNpbmdsZQotICogZG9tYWluIG1vZGVsLiBBbGwgdGhlIGJ1ZmZlcmQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIGNhbiBiZSBob29rZWQgdG8gdGhlCi0gKiBzYW1lIHRyaWdnZXIsIGFuZCB0aGF0IHRyaWdnZXIgaXMgY29udHJvbGxlZCBieSB0aGUgYXBwbGljYXRpb24sIHR5cGljYWxseQotICogdmlhIHRoZSBPSyBidXR0b24gaW4gYSBkaWFsb2cuCi0gKiAKLSAqIEBzZWUgUHJvcGVydHlBc3BlY3RBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCi0JLyoqCi0JICogV2UgY2FjaGUgdGhlIHZhbHVlIGhlcmUgdW50aWwgaXQgaXMgYWNjZXB0ZWQgYW5kIHBhc3NlZAotCSAqIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCBUIGJ1ZmZlcmVkVmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNldCB0byB0cnVlIHdoZW4gd2UgYXJlICJhY2NlcHRpbmciIHRoZSBidWZmZXJlZCB2YWx1ZQotCSAqIGFuZCBwYXNzaW5nIGl0IHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLiBUaGlzIGFsbG93cwotCSAqIHVzIHRvIGlnbm9yZSB0aGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZpcmVkIGJ5IHRoZSB3cmFwcGVkCi0JICogdmFsdWUgaG9sZGVyLgotCSAqIChXZSBjYW4ndCBzdG9wIGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIsIGJlY2F1c2UKLQkgKiBpZiB3ZSBhcmUgdGhlIG9ubHkgbGlzdGVuZXIgdGhhdCBjb3VsZCAiZGVhY3RpdmF0ZSIgdGhlIHdyYXBwZWQKLQkgKiB2YWx1ZSBob2xkZXIuKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdGluZzsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHRyaWdnZXIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVmZmVyZWQgdmFsdWUKLQkgKiBzaG91bGQgYmUgYWNjZXB0ZWQgb3IgcmVzZXQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0cmlnZ2VySG9sZGVyOwotCi0JLyoqIFRoaXMgbGlzdGVucyB0byB0aGUgdHJpZ2dlciBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdHJpZ2dlckNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIG91ciBidWZmZXJlZCB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZAotCSAqIGEgdmFsdWUgYW5kIGlzIHBvc3NpYmx5IG91dCBvZiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1ZmZlcmluZzsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYnVmZmVyZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJpZ2dlciBob2xkZXIuCi0JICovCi0JcHVibGljIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0cmlnZ2VySG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJaWYgKHRyaWdnZXJIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmlnZ2VySG9sZGVyID0gdHJpZ2dlckhvbGRlcjsKLQkJdGhpcy5idWZmZXJlZFZhbHVlID0gbnVsbDsKLQkJdGhpcy5idWZmZXJpbmcgPSBmYWxzZTsKLQkJdGhpcy5hY2NlcHRpbmcgPSBmYWxzZTsKLQkJdGhpcy50cmlnZ2VyQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy50cmlnZ2VyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmlnZ2VyIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgY3VycmVudGx5ICJidWZmZXJpbmciIGEgdmFsdWUsIHJldHVybiB0aGF0OwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSB3cmFwcGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWZmZXJpbmcgPyB0aGlzLmJ1ZmZlcmVkVmFsdWUgOiB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQXNzaWduIHRoZSBuZXcgdmFsdWUgdG8gb3VyICJidWZmZXJlZCIgdmFsdWUuCi0JICogSXQgd2lsbCBiZSBwdXNoZWQgdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyCi0JICogd2hlbiB0aGUgdHJpZ2dlciBpcyAiYWNjZXB0ZWQiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbCh2YWx1ZSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUKLQkJCQl0aGlzLnJlc2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBjaGFuZ2VkCi0JCQkJT2JqZWN0IG9sZCA9IHRoaXMuYnVmZmVyZWRWYWx1ZTsKLQkJCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSB2YWx1ZTsKLQkJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodmFsdWUsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBvcmlnaW5hbCB2YWx1ZSAtIGlnbm9yZQotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IGZvciB0aGUgZmlyc3QgdGltZQotCQkJCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JCQkJdGhpcy5idWZmZXJlZFZhbHVlID0gdmFsdWU7Ci0JCQkJdGhpcy5idWZmZXJpbmcgPSB0cnVlOwotCQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBleHRlbnNpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIGV4dGVuZCB0byBlbmdhZ2UgdGhlIHRyaWdnZXIgaG9sZGVyIGFsc28KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy50cmlnZ2VySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBleHRlbmQgdG8gZGlzZW5nYWdlIHRoZSB0cmlnZ2VyIGhvbGRlciBhbHNvCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudHJpZ2dlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGFyZSBjdXJyZW50bHkgImFjY2VwdGluZyIgdGhlIHZhbHVlIChpLmUgcGFzc2luZyBpdCBvbiB0byB0aGUKLQkgKiAid3JhcHBlZCIgbW9kZWwpLCBpZ25vcmUgY2hhbmdlIG5vdGlmaWNhdGlvbnMsIHNpbmNlIHdlIGNhdXNlZAotCSAqIHRoZW0gYW5kIG91ciBvd24gbGlzdGVuZXJzIGFyZSBhbHJlYWR5IGF3YXJlIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuYWNjZXB0aW5nKSB7Ci0JCQl0aGlzLnZhbHVlQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUsIGNoZWNrIHdoZXRoZXIgdGhlICJ3cmFwcGVkIiB2YWx1ZSBoYXMKLQkgKiBjaGFuZ2VkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSAiYnVmZmVyZWQiIHZhbHVlLiBJZiBpdCBoYXMsIHN0b3AgImJ1ZmZlcmluZyI7Ci0JICogaWYgbm90LCBkbyBub3RoaW5nLgotCSAqIElmIHdlIGRvIG5vdCB5ZXQgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUsIHNpbXBseSBwcm9wYWdhdGUgdGhlCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSBidWZmZXJlZCBtb2RlbCBhcyB0aGUgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5idWZmZXJpbmcpIHsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGV2ZW50LmdldE5ld1ZhbHVlKCksIHRoaXMuYnVmZmVyZWRWYWx1ZSkpIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZhbHVlCi0JCQkJdGhpcy5yZXNldCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmhhbmRsZUNoYW5nZUNvbmZsaWN0KGV2ZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBpZiB3ZSBoYXZlIGEgImJ1ZmZlcmVkIiB2YWx1ZSBhbmQgdGhlICJ3cmFwcGVkIiB2YWx1ZSBjaGFuZ2VzLAotCSAqIHdlIHNpbXBseSBpZ25vcmUgdGhlIG5ldyAid3JhcHBlZCIgdmFsdWUgYW5kIHNpbXBseSBvdmVybGF5IGl0IHdpdGggdGhlCi0JICogImJ1ZmZlcmVkIiB2YWx1ZSBpZiBpdCBpcyAiYWNjZXB0ZWQiLiAoIkxhc3QgT25lIEluIFdpbnMiIGNvbmN1cnJlbmN5IG1vZGVsKQotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB0aGF0IGJlaGF2aW9yIHdpdGggYQotCSAqIGRpZmZlcmVudCBjb25jdXJyZW5jeSBtb2RlbC4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBkcm9wIHRoZSAiYnVmZmVyZWQiIHZhbHVlCi0JICogYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3ICJ3cmFwcGVkIiB2YWx1ZSwgb3IgeW91IGNvdWxkIHRocm93IGFuCi0JICogZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZUNvbmZsaWN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJpZ2dlciBjaGFuZ2VkOjx1bD4KLQkgKiA8bGk+SWYgaXQgaXMgbm93IHRydWUsICJhY2NlcHQiIHRoZSBidWZmZXJlZCB2YWx1ZSBhbmQgcHVzaAotCSAqIGl0IHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4KLQkgKiA8bGk+SWYgaXQgaXMgbm93IGZhbHNlLCAicmVzZXQiIHRoZSBidWZmZXJlZCB2YWx1ZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCi0JICogPC91bD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmlnZ2VyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGlmIG5vdGhpbmcgaGFzIGJlZW4gImJ1ZmZlcmVkIiwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZzoKLQkJLy8gbm90aGluZyBuZWVkcyB0byBiZSBwYXNzZWQgdGhyb3VnaDsgbm90aGluZyBuZWVkcyB0byBiZSByZXNldDsKLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXRoaXMuYWNjZXB0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVzZXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjY2VwdCgpIHsKLQkJLy8gc2V0IHRoZSBhY2NlcHRpbmcgZmxhZyBzbyB3ZSBpZ25vcmUgYW55IGV2ZW50cwotCQkvLyBmaXJlZCBieSB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIKLQkJdGhpcy5hY2NlcHRpbmcgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKHRoaXMuYnVmZmVyZWRWYWx1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQkJdGhpcy5idWZmZXJpbmcgPSBmYWxzZTsKLQkJCS8vIGNsZWFyIHRoZSBmbGFnIG9uY2UgdGhlICJhY2NlcHQiIGlzIGNvbXBsZXRlCi0JCQl0aGlzLmFjY2VwdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCS8vIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgb3VyIHZhbHVlIGhhcyBiZWVuIHJlc2V0Ci0JCU9iamVjdCBvbGQgPSB0aGlzLmJ1ZmZlcmVkVmFsdWU7Ci0JCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyaW5nID0gZmFsc2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGJ1ZmZlcmVkIG1vZGVsIGlzIGN1cnJlbnRseSAiYnVmZmVyaW5nIgotCSAqIGEgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdWZmZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmJ1ZmZlcmluZzsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTxUPn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiA8Y29kZT5UcmlnZ2VyPC9jb2RlPiBpcyBhIHNwZWNpYWwgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBvbmx5IG1haW50YWlucyBpdHMKLQkgKiB2YWx1ZSAob2YgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+KSBkdXJpbmcgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gY2F1c2VkIGJ5Ci0JICoge0BsaW5rICNzZXRWYWx1ZShUKX0uIEluIG90aGVyIHdvcmRzLCBhIDxjb2RlPlRyaWdnZXI8L2NvZGU+Ci0JICogb25seSBoYXMgYSB2YWxpZCB2YWx1ZSB3aGVuIGl0IGlzIGJlaW5nIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdCBhIHRyaWdnZXIgd2l0aCBhIG51bGwgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgVHJpZ2dlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIEV4dGVuZCBzbyB0aGF0IHRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nCi0JCSAqIGNoYW5nZSBub3RpZmljYXRpb24gdHJpZ2dlcmVkIGJ5IHtAbGluayAjc2V0VmFsdWUoT2JqZWN0KX0uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1ldGhvZCBUcmlnZ2VyLmdldFZhbHVlKCkgbWF5IG9ubHkgYmUgY2FsbGVkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBFeHRlbmQgdG8gcmVzZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+IG9uY2UgYWxsIHRoZQotCQkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JCS8qKgotCQkgKiBTZXQgdGhlIHRyaWdnZXIncyB2YWx1ZTo8dWw+Ci0JCSAqIAk8bGk+PGNvZGU+dHJ1ZTwvY29kZT4gaW5kaWNhdGVzICJhY2NlcHQiCi0JCSAqIAk8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRlcyAicmVzZXQiCi0JCSAqIDwvdWw+Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCQl0aGlzLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgdHJpZ2dlcidzIHZhbHVlOjx1bD4KLQkJICogCTxsaT48Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMgImFjY2VwdCIKLQkJICogCTxsaT48Y29kZT5mYWxzZTwvY29kZT4gaW5kaWNhdGVzICJyZXNldCIKLQkJICogPC91bD4KLQkJICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWNjZXB0IHRoZSB0cmlnZ2VyIChpLmUuIHNldCBpdHMgdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4pLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWNjZXB0KCkgewotCQkJdGhpcy5zZXRWYWx1ZSh0cnVlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHJpZ2dlciBoYXMgYmVlbiBhY2NlcHRlZAotCQkgKiAoaS5lLiBpdHMgdmFsdWUgd2FzIGNoYW5nZWQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4pLgotCQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBY2NlcHRlZCgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlc2V0IHRoZSB0cmlnZ2VyIChpLmUuIHNldCBpdHMgdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHRyaWdnZXIgaGFzIGJlZW4gcmVzZXQKLQkJICogKGkuZS4gaXRzIHZhbHVlIHdhcyBjaGFuZ2VkIHRvIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1Jlc2V0KCkgewotCQkJcmV0dXJuICEgdGhpcy5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTkzMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gdHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZhbHVlKCl9LgotICogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kIGNhY2hlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGV2ZXJ5Ci0gKiB0aW1lIHRoZSB3cmFwcGVkIHZhbHVlIGNoYW5nZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBvbGQgdmFsdWUKLSAqIHBhc3NlZCBpbiB0byB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KX0KLSAqIGNhbiBubyBsb25nZXIgYmUgInRyYW5zZm9ybWVkIiBiZWNhdXNlIGl0cyBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQuCi0gKiBUaGlzIGNhY2hpbmcgY2FuIGFsc28gaW1wcm92ZSB0aW1lIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LAotICogYSBzdWJjbGFzcyBvZiA8Y29kZT5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgc28gdGhhdCBkdXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG5vdGlmaWNhdGlvbgotCSAqIHdlIGRvIG5vdCBoYXZlIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLiBUaGUgb2xkIHZhbHVlIGNvdWxkIG5vIGxvbmdlciBiZSB2YWxpZCBpbgotCSAqIHRoZSBtb2RlbDsgYXMgYSByZXN1bHQsIHRyYW5zZm9ybWluZyBpdCB3b3VsZCBub3QgYmUgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFQyIGNhY2hlZFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlciwgVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBoYXZlIGxpc3RlbmVycywgdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUgYW5kIGNhY2hlIHRoZSByZXN1bHQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMsIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBudWxsOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vIG5lZWQgdG8gdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUsIHNpbXBseSByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSwKLQkgKiB3aGljaCBpcyBhbHJlYWR5IHRyYW5zZm9ybWVkLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUMiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLCBjYWNoaW5nIGl0IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICogQSBiaXQgb2YgYSBzaWRlLWVmZmVjdCwgYnV0IGl0IHNlZW1zIHJlYXNvbmFibGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU5ldyhUMSB2YWx1ZSkgewotCQl0aGlzLmNhY2hlZFZhbHVlID0gc3VwZXIudHJhbnNmb3JtTmV3KHZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG9sZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU9sZChUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzdmMTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPGNvZGU+IGF1Z21lbnRzIHRoZQotICogYmVoYXZpb3Igb2YgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYnkgY2FjaGluZwotICogdGhlIHRyYW5zZm9ybWVkIHZhbHVlLgotICogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kIGNhY2hlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGV2ZXJ5Ci0gKiB0aW1lIHRoZSB3cmFwcGVkIHZhbHVlIGNoYW5nZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBvbGQgdmFsdWUKLSAqIHBhc3NlZCBpbiB0byB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KX0KLSAqIGNhbiBubyBsb25nZXIgYmUgInRyYW5zZm9ybWVkIiBiZWNhdXNlIGl0cyBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQuCi0gKiBUaGlzIGNhY2hpbmcgY2FuIGFsc28gaW1wcm92ZSB0aW1lIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotewotCS8qKgotCSAqIENhY2hlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBzbyB0aGF0IGR1cmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uCi0JICogd2UgZG8gbm90IGhhdmUgdG8gdHJhbnNmb3JtIHRoZSBvbGQgdmFsdWUuIFRoZSBvbGQgdmFsdWUgY291bGQgbm8gbG9uZ2VyIGJlIHZhbGlkIGluCi0JICogdGhlIG1vZGVsOyBhcyBhIHJlc3VsdCwgdHJhbnNmb3JtaW5nIGl0IHdvdWxkIG5vdCBiZSB2YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgY2FjaGVkVmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBhbmQge0BsaW5rIHJldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBiaWRpIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4gdmFsdWVIb2xkZXIsIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGhhdmUgbGlzdGVuZXJzLCB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycywgY2xlYXIgdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IG51bGw7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUsIGNhY2hpbmcgaXQgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKiBBIGJpdCBvZiBhIHNpZGUtZWZmZWN0LCBidXQgaXQgc2VlbXMgcmVhc29uYWJsZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtTmV3KFQxIHZhbHVlKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBzdXBlci50cmFuc2Zvcm1OZXcodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBObyBuZWVkIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUsCi0JICogd2hpY2ggaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtT2xkKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlZFZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmQ2ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjYnVpbGRDaGFuZ2VMaXN0ZW5lcigpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgbW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNoYW5nZSBsaXN0ZW5lciBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbW9kZWwgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmNGI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcwotICogYmFzaWMgY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgY29sbGVjdGlvbnMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRVN9IGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcn0pOjx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEl0ZXJhYmxlKCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplXygpfQotICogPGxpPntAbGluayAjaXRlcmF0b3JfKCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVyYXRvcigpfQotICogPGxpPntAbGluayAjc2l6ZSgpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbnMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gY29sbGVjdGlvbk5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0NPTExFQ1RJT05fTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge2NvbGxlY3Rpb25OYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGNvbGxlY3Rpb25OYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLmNvbGxlY3Rpb25OYW1lcyA9IGNvbGxlY3Rpb25OYW1lczsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgY29sbGVjdGlvbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tjb2xsZWN0aW9uTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBjb2xsZWN0aW9uIGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBjb2xsZWN0aW9uIGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9DT0xMRUNUSU9OX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUVTIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudC5jbG9uZSh0aGlzLCBWQUxVRVMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBkMjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0VmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBUbyBtYWludGFpbiBhIHJlYXNvbmFibHkgY29uc2lzdGVudCBhcHBlYXJhbmNlIHRvIGNsaWVudCBjb2RlLCB3ZQotICoga2VlcCBhbiBpbnRlcm5hbCBsaXN0IHNvbWV3aGF0IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogY29sbGVjdGlvbiB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIGFueSBldmVudHMgZmlyZWQgYnkgdGhlIGNvbGxlY3Rpb24gaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogT3VyIGludGVybmFsIGxpc3QsIHdoaWNoIGhvbGRzIHRoZSBzYW1lIGVsZW1lbnRzIGFzCi0JICogdGhlIHdyYXBwZWQgY29sbGVjdGlvbiwgYnV0IGtlZXBzIHRoZW0gaW4gb3JkZXIuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb25Ib2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gY29sbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgbGlzdCBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24KLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRMaXN0KCkgewotCQkvLyBpZiB0aGUgbmV3IGNvbGxlY3Rpb24gaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkTGlzdChzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdChpbnQgc2l6ZSkgewotCQl0aGlzLmxpc3QuZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5jb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGVhY2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdCh0aGlzLmluZGV4VG9BZGRJdGVtcygpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgaW5kZXhUb0FkZEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0JCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIGxpc3Qgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHNpemUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5saXN0LmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJdGhpcy5idWlsZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgMCwgdGhpcy5saXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCQkJdGhpcy5idWlsZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMubGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YTdjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGNvbGxlY3Rpb24gdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2NvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2NvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Vj4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ0MzIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZQotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg4MWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk51bGxMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHRvIHlldCBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9LiBUaGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIGNvbnRhaW5zCi0gKiB0aGUgY29tYmluZWQgaXRlbXMgZnJvbSBhbGwgdGhlc2UgY29tcG9uZW50IGNvbGxlY3Rpb25zLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIG11c3QgYmUgYW4gImlkZW50aXR5IHNldCIgdGhhdCBkb2VzIG5vdAotICogY29udGFpbiB0aGUgc2FtZSBpdGVtIHR3aWNlIG9yIHRoaXMgY2xhc3Mgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gKiA8cD4KLSAqIFRlcm1pbm9sb2d5Ojx1bD4KLSAqIDxsaT48ZW0+c291cmNlczwvZW0+IC0gdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWw7IHRoZXNlCi0gKiAgICBhcmUgY29udmVydGVkIGludG8gY29tcG9uZW50IENWTXMgYnkgdGhlIHRyYW5zZm9ybWVyCi0gKiA8bGk+PGVtPmNvbXBvbmVudCBDVk1zPC9lbT4gLSB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIHRoYXQgYXJlIGNvbWJpbmVkCi0gKiAgICBieSB0aGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsCi0gKiA8bGk+PGVtPml0ZW1zPC9lbT4gLSB0aGUgaXRlbXMgaGVsZCBieSB0aGUgY29tcG9uZW50IENWTXMKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMSwgRTI+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RTE+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4KLXsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSAob3B0aW9uYWwpIHVzZXItc3VwcGxpZWQgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcwotCSAqIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHRvIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIHRoYXQKLQkgKiB3ZXJlIGdlbmVyYXRlZCBieSB0aGUgdHJhbnNmb3JtZXI7IGtleWVkIGJ5IHRoZSBpdGVtCi0JICogaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgSWRlbnRpdHlIYXNoTWFwPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IGNvbXBvbmVudENWTXMgPQotCQkJbmV3IElkZW50aXR5SGFzaE1hcDxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PigpOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIGNvbGxlY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIGFib3ZlOyBrZXllZCBieSB0aGUgY29tcG9uZW50Ci0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMuCi0JICogVXNlIHtAbGluayBBcnJheUxpc3R9cyBzbyB3ZSBjYW4gdXNlIHtAbGluayBBcnJheUxpc3R9LXNwZWNpZmljIG1ldGhvZHMKLQkgKiAoZS5nLiB7QGxpbmsgQXJyYXlMaXN0I2Nsb25lKCl9IGFuZCB7QGxpbmsgQXJyYXlMaXN0I2Vuc3VyZUNhcGFjaXR5KGludCl9KS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElkZW50aXR5SGFzaE1hcDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4sIEFycmF5TGlzdDxFMj4+IGNvbGxlY3Rpb25zID0KLQkJCW5ldyBJZGVudGl0eUhhc2hNYXA8Q29sbGVjdGlvblZhbHVlTW9kZWw8RTI+LCBBcnJheUxpc3Q8RTI+PigpOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4gKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb21wb25lbnRDVk1MaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgY29tcG9zaXRlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+Pmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyID0gdGhpcy5idWlsZENvbXBvbmVudExpc3RlbmVyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFMT4obGlzdEhvbGRlcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEUxPihsaXN0SG9sZGVyKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbi4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxPihjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb24sIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxPihjb2xsZWN0aW9uKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbi4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKEUxLi4uIGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RTE+KGNvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChFMVtdIGNvbGxlY3Rpb24sIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxPihjb2xsZWN0aW9uKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29tcG9uZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudENvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50Q29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29tcG9uZW50IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbnNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEl0ZXJhdG9yPEUyPj4gYnVpbGRDb2xsZWN0aW9uc0l0ZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEFycmF5TGlzdDxFMj4sIEl0ZXJhdG9yPEUyPj4odGhpcy5jb2xsZWN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEFycmF5TGlzdDxFMj4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIGFsbCB0aGUgc291cmNlcyB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscwotCSAqIGFuZCBhZGQgdGhlaXIgaXRlbXMgdG8gb3VyIGNhY2hlLCB3aXRoIG5vIGV2ZW50IG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQlmb3IgKEUxIHNvdXJjZSA6IHRoaXMuY29sbGVjdGlvbkhvbGRlcikgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2Uoc291cmNlLCBOdWxsTGlzdC48RTI+aW5zdGFuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbXBvbmVudHMuLi4KLQkJZm9yIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNIDogdGhpcy5jb21wb25lbnRDVk1zLnZhbHVlcygpKSB7Ci0JCQljb21wb25lbnRDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmNvbXBvbmVudENWTXMuY2xlYXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9ucy5jbGVhcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBhZGRlZDsKLQkgKiBhZGQgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtcyB0byBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQkJZm9yIChFMSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuYWRkQ29tcG9uZW50U291cmNlKGl0ZW0sIGFkZGVkSXRlbXMpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoVkFMVUVTLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBzb3VyY2UgdG8gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsCi0JICogYW5kIGFkZCBpdHMgaXRlbXMgdG8gb3VyIGNhY2hlIGFuZCB0aGUgImNvbGxlY3RpbmcgcGFyYW1ldGVyIi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRTb3VyY2UoRTEgc291cmNlLCBMaXN0PEUyPiBhZGRlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLnRyYW5zZm9ybShzb3VyY2UpOwotCQlpZiAodGhpcy5jb21wb25lbnRDVk1zLnB1dChzb3VyY2UsIGNvbXBvbmVudENWTSkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZHVwbGljYXRlIGNvbXBvbmVudDogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb21wb25lbnRDVk0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENWTS5zaXplKCkpOwotCQlpZiAodGhpcy5jb2xsZWN0aW9ucy5wdXQoY29tcG9uZW50Q1ZNLCBjb21wb25lbnRDb2xsZWN0aW9uKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29sbGVjdGlvbjogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCWFkZGVkSXRlbXMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBjb21wb25lbnQgQ1ZNIHRvIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50Ci0JICogY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRJdGVtcyhDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNLCBBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24pIHsKLQkJaW50IGl0ZW1zU2l6ZSA9IGNvbXBvbmVudENWTS5zaXplKCk7Ci0JCXRoaXMuc2l6ZSArPSBpdGVtc1NpemU7Ci0JCWNvbXBvbmVudENvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoY29tcG9uZW50Q29sbGVjdGlvbi5zaXplKCkgKyBpdGVtc1NpemUpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24sIGNvbXBvbmVudENWTSk7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlbW92ZWQ7Ci0JICogcmVtb3ZlIHRoZWlyIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JCWZvciAoRTEgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShpdGVtLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpdGVtcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlKEUxIHNvdXJjZSwgTGlzdDxFMj4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLmNvbXBvbmVudENWTXMucmVtb3ZlKHNvdXJjZSk7Ci0JCWlmIChjb21wb25lbnRDVk0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb21wb25lbnQ6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29tcG9uZW50Q1ZNLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihWQUxVRVMsIHRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLnJlbW92ZShjb21wb25lbnRDVk0pOwotCQlpZiAoY29tcG9uZW50Q29sbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGNvbGxlY3Rpb246ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVtb3ZlZEl0ZW1zLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRJdGVtcyhjb21wb25lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgb3VyIHNpemUgYW5kIGNvbGxlY3Rpb24gY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50SXRlbXMoQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uKSB7Ci0JCXRoaXMuc2l6ZSAtPSBjb21wb25lbnRDb2xsZWN0aW9uLnNpemUoKTsKLQkJY29tcG9uZW50Q29sbGVjdGlvbi5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjbGVhcmVkOwotCSAqIGNsZWFyIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQkvLyBjb3B5IHRoZSBrZXlzIHNvIHdlIGRvbid0IGVhdCBvdXIgb3duIHRhaWwKLQkJQXJyYXlMaXN0PEUxPiBjb3B5ID0gbmV3IEFycmF5TGlzdDxFMT4odGhpcy5jb21wb25lbnRDVk1zLmtleVNldCgpKTsKLQkJZm9yIChFMSBzb3VyY2UgOiBjb3B5KSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShzb3VyY2UsIE51bGxMaXN0LjxFMj5pbnN0YW5jZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOwotCSAqIHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5pdGVyYXRvcigpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiB0cmFuc2Zvcm0oRTEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyBoYWQgaXRlbXMgYWRkZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpbnQgaXRlbXNTaXplID0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCXRoaXMuc2l6ZSArPSBpdGVtc1NpemU7Ci0KLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQodGhpcy5jb21wb25lbnRDVk0oZXZlbnQpKTsKLQkJY29tcG9uZW50Q29sbGVjdGlvbi5lbnN1cmVDYXBhY2l0eShjb21wb25lbnRDb2xsZWN0aW9uLnNpemUoKSArIGl0ZW1zU2l6ZSk7Ci0KLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmdldENvbXBvbmVudEl0ZW1zKGV2ZW50KSwgY29tcG9uZW50Q29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyBoYWQgaXRlbXMgcmVtb3ZlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zaXplIC09IGV2ZW50LmdldEl0ZW1zU2l6ZSgpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGhpcy5nZXRDb21wb25lbnRJdGVtcyhldmVudCksIGNvbXBvbmVudENvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgd2FzIGNsZWFyZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcyBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcyBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogY29sbGVjdGlvbiBhbmQgdGhlbiByZWJ1aWxkaW5nIGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy5jb21wb25lbnRDVk0oZXZlbnQpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChjb21wb25lbnRDVk0pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFMj4gZ2V0Q29tcG9uZW50SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0oQ29sbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+KSBldmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2ExM2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCB0byB5ZXQgYW5vdGhlcgotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4gVGhpcyBjb21wb3NpdGUgbGlzdCBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBsaXN0cy4KLSAqIDxwPgotICogVGVybWlub2xvZ3k6PHVsPgotICogPGxpPjxlbT5zb3VyY2VzPC9lbT4gLSB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbDsgdGhlc2UKLSAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byBjb21wb25lbnQgTFZNcyBieSB0aGUgdHJhbnNmb3JtZXIKLSAqIDxsaT48ZW0+Y29tcG9uZW50IExWTXM8L2VtPiAtIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMgdGhhdCBhcmUgY29tYmluZWQKLSAqICAgIGJ5IHRoaXMgY29tcG9zaXRlIGxpc3QgdmFsdWUgbW9kZWwKLSAqIDxsaT48ZW0+aXRlbXM8L2VtPiAtIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgTFZNcwotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCS8qKgotCSAqIFRoaXMgaXMgdGhlIChvcHRpb25hbCkgdXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCB0cmFuc2Zvcm1zCi0JICogdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGxpc3QgdG8gbGlzdCB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcjsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBzb3VyY2VzLCBjb21wb25lbnQgTFZNcywgbGlzdHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5mbz4gaW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KCk7Ci0JcHJvdGVjdGVkIGNsYXNzIEluZm8gewotCQkvLyB0aGUgb2JqZWN0IHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtZXIKLQkJZmluYWwgRTEgc291cmNlOwotCQkvLyB0aGUgbGlzdCB2YWx1ZSBtb2RlbCBnZW5lcmF0ZWQgYnkgdGhlIHRyYW5zZm9ybWVyCi0JCWZpbmFsIExpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk07Ci0JCS8vIGNhY2hlIG9mIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgTFZNCi0JCWZpbmFsIEFycmF5TGlzdDxFMj4gaXRlbXM7Ci0JCS8vIHRoZSBjb21wb25lbnQgTFZNJ3MgYmVnaW5uaW5nIGluZGV4IHdpdGhpbiB0aGUgY29tcG9zaXRlIExWTQotCQlpbnQgYmVnaW47Ci0JCUluZm8oRTEgc291cmNlLCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNLCBBcnJheUxpc3Q8RTI+IGl0ZW1zLCBpbnQgYmVnaW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMuY29tcG9uZW50TFZNID0gY29tcG9uZW50TFZNOwotCQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCQkJdGhpcy5iZWdpbiA9IGJlZ2luOwotCQl9Ci0JfQotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGNvbXBvbmVudCBsaXN0IHZhbHVlIG1vZGVscy4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBjb21wb25lbnRMVk1MaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgY29tcG9zaXRlIGxpc3QuICovCi0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgbGlzdCB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+Pmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyID0gdGhpcy5idWlsZENvbXBvbmVudExWTUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0LiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0LiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoRTEuLi4gbGlzdCkgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKEUxW10gbGlzdCwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudExpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbXBvbmVudCBMVk0gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gdGhpcy5zaXplKSkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAiICsgdGhpcy5zaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgaW5mbyBsaXN0Ci0JCWZvciAoaW50IGkgPSB0aGlzLmluZm9MaXN0LnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChpKTsKLQkJCWlmIChpbmRleCA+PSBpbmZvLmJlZ2luKSB7Ci0JCQkJcmV0dXJuIGluZm8uaXRlbXMuZ2V0KGluZGV4IC0gaW5mby5iZWdpbik7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyAgLy8gc29tZXRoaW5nIGlzIHdhY2sKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEUyPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8RTI+KHRoaXMuYnVpbGRMaXN0c0l0ZXJhdG9ycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFMj4+IGJ1aWxkTGlzdHNJdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8SW5mbywgTGlzdEl0ZXJhdG9yPEUyPj4odGhpcy5pbmZvTGlzdC5saXN0SXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEUyPiB0cmFuc2Zvcm0oSW5mbyBpbmZvKSB7Ci0JCQkJcmV0dXJuIGluZm8uaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlciwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb21wb25lbnQgTFZNcy4uLgotCQlmb3IgKEluZm8gaW5mbyA6IHRoaXMuaW5mb0xpc3QpIHsKLQkJCWluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmluZm9MaXN0LmNsZWFyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGFkZGVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBEbyBub3QgZmlyZSBhbiBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRTb3VyY2VzKGludCBhZGRlZFNvdXJjZXNJbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBhZGRlZFNvdXJjZXMsIGludCBhZGRlZFNvdXJjZXNTaXplKSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhhZGRlZFNvdXJjZXNJbmRleCwgYWRkZWRTb3VyY2VzLCBhZGRlZFNvdXJjZXNTaXplLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogQWRkIGluZm9zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2VzIHRvIG91ciBjYWNoZS4KLQkgKiBGaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiByZXF1ZXN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50U291cmNlcyhpbnQgYWRkZWRTb3VyY2VzSW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gYWRkZWRTb3VyY2VzLCBpbnQgYWRkZWRTb3VyY2VzU2l6ZSwgYm9vbGVhbiBmaXJlRXZlbnQpIHsKLQkJQXJyYXlMaXN0PEluZm8+IG5ld0luZm9MaXN0ID0gbmV3IEFycmF5TGlzdDxJbmZvPihhZGRlZFNvdXJjZXNTaXplKTsKLQkJLy8gdGhlICdpdGVtcycgYXJlIGVpdGhlciB0YWNrZWQgb24gdG8gdGhlIGVuZCBvcgotCQkvLyBhdCB0aGUgJ2JlZ2luJyBpbmRleCBvZiB0aGUgZmlyc3QgJ2luZm8nIHRoYXQgaXMgYmVpbmcgcHVzaGVkIGJhY2sKLQkJaW50IG5ld0l0ZW1zSW5kZXggPSAoYWRkZWRTb3VyY2VzSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQoYWRkZWRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCi0JCWludCBiZWdpbiA9IG5ld0l0ZW1zSW5kZXg7Ci0JCWZvciAoRTEgc291cmNlIDogYWRkZWRTb3VyY2VzKSB7Ci0JCQlMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNID0gdGhpcy50cmFuc2Zvcm0oc291cmNlKTsKLQkJCWNvbXBvbmVudExWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudExWTS5zaXplKCkpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpdGVtcywgY29tcG9uZW50TFZNLmxpc3RJdGVyYXRvcigpKTsKLQkJCW5ld0luZm9MaXN0LmFkZChuZXcgSW5mbyhzb3VyY2UsIGNvbXBvbmVudExWTSwgaXRlbXMsIGJlZ2luKSk7Ci0JCQliZWdpbiArPSBpdGVtcy5zaXplKCk7Ci0JCX0KLQkJdGhpcy5pbmZvTGlzdC5hZGRBbGwoYWRkZWRTb3VyY2VzSW5kZXgsIG5ld0luZm9MaXN0KTsKLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGJlZ2luIC0gbmV3SXRlbXNJbmRleDsKLQkJdGhpcy5zaXplICs9IG5ld0l0ZW1zU2l6ZTsKLQotCQkvLyBidW1wIHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBwdXNoZWQgYmFjayBieSB0aGUgaW5zZXJ0Ci0JCWludCBtb3ZlZEluZm9zSW5kZXggPSBhZGRlZFNvdXJjZXNJbmRleCArIGFkZGVkU291cmNlc1NpemU7Ci0JCWZvciAoaW50IGkgPSBtb3ZlZEluZm9zSW5kZXg7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBuZXdJdGVtc1NpemU7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IG5ld0l0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4obmV3SXRlbXNTaXplKTsKLQkJCWZvciAoaW50IGkgPSBhZGRlZFNvdXJjZXNJbmRleDsgaSA8IG1vdmVkSW5mb3NJbmRleDsgaSsrKSB7Ci0JCQkJbmV3SXRlbXMuYWRkQWxsKHRoaXMuaW5mb0xpc3QuZ2V0KGkpLml0ZW1zKTsKLQkJCX0KLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIG5ld0l0ZW1zSW5kZXgsIG5ld0l0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogRG8gbm90IGZpcmUgYW4gZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgcmVtb3ZlZFNvdXJjZXNJbmRleCwgaW50IHJlbW92ZWRTb3VyY2VzU2l6ZSkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMocmVtb3ZlZFNvdXJjZXNJbmRleCwgcmVtb3ZlZFNvdXJjZXNTaXplLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyBmcm9tIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRTb3VyY2VzKGludCByZW1vdmVkU291cmNlc0luZGV4LCBpbnQgcmVtb3ZlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlpbnQgcmVtb3ZlZEl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldChyZW1vdmVkU291cmNlc0luZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVkU291cmNlc0luZGV4ID0gcmVtb3ZlZFNvdXJjZXNJbmRleCArIHJlbW92ZWRTb3VyY2VzU2l6ZTsKLQkJaW50IG1vdmVkSXRlbXNJbmRleCA9IChtb3ZlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChtb3ZlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gbW92ZWRJdGVtc0luZGV4IC0gcmVtb3ZlZEl0ZW1zSW5kZXg7Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCUxpc3Q8SW5mbz4gc3ViTGlzdCA9IHRoaXMuaW5mb0xpc3Quc3ViTGlzdChyZW1vdmVkU291cmNlc0luZGV4LCByZW1vdmVkU291cmNlc0luZGV4ICsgcmVtb3ZlZFNvdXJjZXNTaXplKTsKLQkJQXJyYXlMaXN0PEluZm8+IHJlbW92ZWRJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oc3ViTGlzdCk7ICAvLyBtYWtlIGEgY29weQotCQlzdWJMaXN0LmNsZWFyKCk7Ci0KLQkJLy8gZGVjcmVtZW50IHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBtb3ZlZCBmb3J3YXJkIGJ5IHRoZSBkZWxldGVzCi0JCWZvciAoaW50IGkgPSByZW1vdmVkU291cmNlc0luZGV4OyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCi0JCWZvciAoSW5mbyByZW1vdmVkSW5mbyA6IHJlbW92ZWRJbmZvTGlzdCkgewotCQkJcmVtb3ZlZEluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KHJlbW92ZWRJdGVtc1NpemUpOwotCQkJZm9yIChJbmZvIHJlbW92ZWRJbmZvIDogcmVtb3ZlZEluZm9MaXN0KSB7Ci0JCQkJcmVtb3ZlZEl0ZW1zLmFkZEFsbChyZW1vdmVkSW5mby5pdGVtcyk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIHJlbW92ZWRJdGVtc0luZGV4LCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlcGxhY2VkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VkIGNvbXBvbmVudCBzb3VyY2VzIHdpbGwgbm90ICh0eXBpY2FsbHkpIG1hcCB0byBhIHNldCBvZiByZXBsYWNlZAotCSAqIGl0ZW1zLCBzbyB3ZSByZW1vdmUgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBsaXN0cyBvZiBpdGVtcywgcmVzdWx0aW5nIGluCi0JICogdHdvIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlQ29tcG9uZW50U291cmNlcyhpbnQgcmVwbGFjZWRTb3VyY2VzSW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gbmV3U291cmNlcywgaW50IHJlcGxhY2VkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhyZXBsYWNlZFNvdXJjZXNJbmRleCwgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgZmlyZUV2ZW50KTsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKHJlcGxhY2VkU291cmNlc0luZGV4LCBuZXdTb3VyY2VzLCByZXBsYWNlZFNvdXJjZXNTaXplLCBmaXJlRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBtb3ZlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb3ZlQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVDb21wb25lbnRTb3VyY2VzKGludCB0YXJnZXRTb3VyY2VzSW5kZXgsIGludCBzb3VyY2VTb3VyY2VzSW5kZXgsIGludCBtb3ZlZFNvdXJjZXNMZW5ndGgsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCWludCBzb3VyY2VJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQoc291cmNlU291cmNlc0luZGV4KS5iZWdpbjsKLQotCQlpbnQgbmV4dFNvdXJjZVNvdXJjZUluZGV4ID0gc291cmNlU291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQlpbnQgbmV4dFNvdXJjZUl0ZW1JbmRleCA9IChuZXh0U291cmNlU291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFNvdXJjZVNvdXJjZUluZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVJdGVtc0xlbmd0aCA9IG5leHRTb3VyY2VJdGVtSW5kZXggLSBzb3VyY2VJdGVtc0luZGV4OwotCi0JCWludCB0YXJnZXRJdGVtc0luZGV4ID0gLTE7Ci0JCWlmIChzb3VyY2VTb3VyY2VzSW5kZXggPiB0YXJnZXRTb3VyY2VzSW5kZXgpIHsKLQkJCS8vIG1vdmUgZnJvbSBoaWdoIHRvIGxvdyBpbmRleAotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHRhcmdldFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCX0gZWxzZSB7Ci0JCQkvLyBtb3ZlIGZyb20gbG93IHRvIGhpZ2ggaW5kZXggKGhpZ2hlciBpdGVtcyBtb3ZlIGRvd24gZHVyaW5nIG1vdmUpCi0JCQlpbnQgbmV4dFRhcmdldFNvdXJjZUluZGV4ID0gdGFyZ2V0U291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IChuZXh0VGFyZ2V0U291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFRhcmdldFNvdXJjZUluZGV4KS5iZWdpbjsKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSB0YXJnZXRJdGVtc0luZGV4IC0gbW92ZUl0ZW1zTGVuZ3RoOwotCQl9Ci0KLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5pbmZvTGlzdCwgdGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgsIG1vdmVkU291cmNlc0xlbmd0aCk7Ci0KLQkJLy8gdXBkYXRlIHRoZSAnYmVnaW4nIGluZGV4ZXMgb2YgYWxsIHRoZSBhZmZlY3RlZCAnaW5mb3MnCi0JCWludCBtaW4gPSBNYXRoLm1pbih0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCk7Ci0JCWludCBtYXggPSBNYXRoLm1heCh0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCkgKyBtb3ZlZFNvdXJjZXNMZW5ndGg7Ci0JCWludCBiZWdpbiA9IE1hdGgubWluKHRhcmdldEl0ZW1zSW5kZXgsIHNvdXJjZUl0ZW1zSW5kZXgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDwgbWF4OyBpKyspIHsKLQkJCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGkpOwotCQkJaW5mby5iZWdpbiA9IGJlZ2luOwotCQkJYmVnaW4gKz0gaW5mby5jb21wb25lbnRMVk0uc2l6ZSgpOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChMSVNUX1ZBTFVFUywgdGFyZ2V0SXRlbXNJbmRleCwgc291cmNlSXRlbXNJbmRleCwgbW92ZUl0ZW1zTGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGNsZWFyZWQ7IGNsZWFyIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5pbmZvTGlzdC5zaXplKCkpOwotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNoYW5nZWQ7IHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5pbmZvTGlzdC5zaXplKCkpOwotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5saXN0SG9sZGVyLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBsaXN0IHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEUyPiB0cmFuc2Zvcm0oRTEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IExWTS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICh0aGlzLmluZm9MaXN0LmdldChpKS5jb21wb25lbnRMVk0gPT0gY29tcG9uZW50TFZNKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb21wb25lbnQgTFZNOiAiICsgY29tcG9uZW50TFZNKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBldmVudCdzIGNvbXBvbmVudCBMVk0uCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleEZvcihMaXN0RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXhPZih0aGlzLmNvbXBvbmVudExWTShldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlpbnQgbmV3SXRlbXNTaXplID0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBuZXdJdGVtc1NpemU7Ci0JCX0KLQkJdGhpcy5zaXplICs9IG5ld0l0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGluZm8uaXRlbXMsIGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCWludCBpdGVtSW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCQlpbmZvLml0ZW1zLnN1Ykxpc3QoaXRlbUluZGV4LCBpdGVtSW5kZXggKyBldmVudC5nZXRJdGVtc1NpemUoKSkuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgaW5mby5iZWdpbikpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBubyBjaGFuZ2VzIHRvIHRoZSAnYmVnaW4nIGluZGljZXMgb3Igc2l6ZQotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRTIgaXRlbSA6IHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmZvLml0ZW1zLnNldChpKyssIGl0ZW0pOwotCQl9Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIGNoYW5nZXMgdG8gdGhlICdiZWdpbicgaW5kaWNlcyBvciBzaXplCi0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGluZm8uaXRlbXMsIGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0cyB3YXMgY2xlYXJlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50TGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCXRoaXMuY2xlYXJDb21wb25lbnRMaXN0KGNvbXBvbmVudExWTUluZGV4LCB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ29tcG9uZW50TGlzdChpbnQgY29tcG9uZW50TFZNSW5kZXgsIEluZm8gaW5mbykgewotCQkvLyB1cGRhdGUgdGhlIGFmZmVjdGVkICdiZWdpbicgaW5kaWNlcwotCQlpbnQgcmVtb3ZlZEl0ZW1zU2l6ZSA9IGluZm8uaXRlbXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGluZm8uaXRlbXMpOwotCQlpbmZvLml0ZW1zLmNsZWFyKCk7Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4sIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0cyBjaGFuZ2VkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZSBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogbGlzdCBhbmQgcmVidWlsZGluZyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQkJdGhpcy5jbGVhckNvbXBvbmVudExpc3QoY29tcG9uZW50TFZNSW5kZXgsIGluZm8pOwotCi0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWludCBuZXdJdGVtc1NpemUgPSBpbmZvLmNvbXBvbmVudExWTS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBuZXdJdGVtc1NpemU7Ci0JCX0KLQkJdGhpcy5zaXplICs9IG5ld0l0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpbmZvLml0ZW1zLCBpbmZvLmNvbXBvbmVudExWTS5saXN0SXRlcmF0b3IoKSwgbmV3SXRlbXNTaXplKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4sIGluZm8uaXRlbXMpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEUyPiBnZXRDb21wb25lbnRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTShMaXN0RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0VmFsdWVNb2RlbDxFMj4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWNjODg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSWRlbnRpdHlIYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGFkYXB0cyBhCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGhvbGRpbmcgb3RoZXIge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH1zCi0gKiB0byBhIHNpbmdsZSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudDo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY29tcG9uZW50IHZhbHVlcwotICogPC91bD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gbXVzdCBub3QgY29udGFpbiBhbnkgZHVwbGljYXRlcwotICogb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAqIDxwPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjb21wb25lbnQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIHNvIHdlIGNhbiBzdG9wIGxpc3RlbmluZyB0bwotCSAqIHRoZW0gd2hlbiB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElkZW50aXR5SGFzaEJhZzxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGNvbXBvbmVudFBWTXMgPSAKLQkJCW5ldyBJZGVudGl0eUhhc2hCYWc8UHJvcGVydHlWYWx1ZU1vZGVsPD8+PigpOwotCi0JLyoqCi0JICogTGlzdGVuIHRvIGV2ZXJ5IHByb3BlcnR5IHZhbHVlIG1vZGVsIGluIHRoZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIElmIG9uZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBvdXIgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdXZlIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/Pi4uLiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdXZlIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbChDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IHZhbHV2ZSBtb2RlbHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIGV2ZW50IGNhbiBiZSB1c2VkIHRvIGltcHJvdmUKLQkgKiB0aGUgcGVyZm9ybWFuY2Ugb2YgYnVpbGRpbmcgYSBuZXcgdmFsdWUgKGUuZy4gc29tZSBwcm9wZXJ0eSBjaGFuZ2VzIG1heQotCSAqIG5vdCBuZWNlc3NpdGF0ZSB0aGUgcmUtY2FsY3VsYXRpb24gb2YgdGhlIHZhbHVlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWxfKCk7Ci0JCXRoaXMuYWRkQ29tcG9uZW50UFZNcyh0aGlzLmdldENvbGxlY3Rpb25Ib2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiB2b2lkIGFkZENvbXBvbmVudFBWTXMoSXRlcmFibGU8RT4gcHZtcykgewotCQlmb3IgKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBlYWNoIDogcHZtcykgewotCQkJdGhpcy5jb21wb25lbnRQVk1zLmFkZChlYWNoKTsKLQkJCWVhY2guYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKHRoaXMuZ2V0Q29sbGVjdGlvbkhvbGRlcigpKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWxfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiB2b2lkIHJlbW92ZUNvbXBvbmVudFBWTXMoSXRlcmFibGU8RT4gcHZtcykgewotCQlmb3IgKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBlYWNoIDogcHZtcykgewotCQkJZWFjaC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5jb21wb25lbnRQVk1zLnJlbW92ZShlYWNoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50UFZNcyh0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCXN1cGVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJc3VwZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFBWTXMoKTsKLQkJc3VwZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbENvbXBvbmVudFBWTXMoKSB7Ci0JCS8vIGNvcHkgdGhlIGxpc3Qgc28gd2UgZG9uJ3QgZWF0IG91ciBvd24gdGFpbAotCQlBcnJheUxpc3Q8UHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBjb3B5ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KHRoaXMuY29tcG9uZW50UFZNcyk7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50UFZNcyhjb3B5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVBbGxDb21wb25lbnRQVk1zKCk7Ci0JCXRoaXMuYWRkQ29tcG9uZW50UFZNcyh0aGlzLmdldENvbGxlY3Rpb25Ib2xkZXIoKSk7Ci0JCXN1cGVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfXtAY29kZTw/IGV4dGVuZHMgfXtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPD8+Pn0uCi0JICovCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBnZXRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH17QGNvZGU8PyBleHRlbmRzIH17QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTw/Pj59LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBnZXRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfXtAY29kZTw/IGV4dGVuZHMgfXtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPD8+Pn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwODE0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB3cmFwcGVyIGV4dGVuZHMgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IChvciB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KQotICogd2l0aCBmaXhlZCBjb2xsZWN0aW9ucyBvZiBpdGVtcyBvbiBlaXRoZXIgZW5kLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBCZSBjYXJlZnVsIHVzaW5nIG9yIHdyYXBwaW5nIHRoaXMgbGlzdCB2YWx1ZSBtb2RlbCwgc2luY2UgdGhlCi0gKiAiZXh0ZW5kZWQiIGl0ZW1zIG1heSBiZSB1bmV4cGVjdGVkIGJ5IHRoZSBjbGllbnQgY29kZSBvciB3cmFwcGVyLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogdGhlIGl0ZW1zICJwcmVwZW5kZWQiIHRvIHRoZSB3cmFwcGVkIGxpc3QgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFPiBwcmVmaXg7Ci0KLQkvKiogdGhlIGl0ZW1zICJhcHBlbmRlZCIgdG8gdGhlIHdyYXBwZWQgbGlzdCAqLwotCXByb3RlY3RlZCBMaXN0PEU+IHN1ZmZpeDsKLQotCi0JLy8gKioqKioqKioqKiBsb3RzIG8nIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggYW5kIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgTGlzdDw/IGV4dGVuZHMgRT4gc3VmZml4KSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IG5ldyBBcnJheUxpc3Q8RT4ocHJlZml4KTsKLQkJdGhpcy5zdWZmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4IGFuZCBzdWZmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKEUgcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgRSBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3Q8PyBleHRlbmRzIEU+IHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gbmV3IEFycmF5TGlzdDxFPihwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoRSBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJlZml4KTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBzdWZmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBMaXN0PD8gZXh0ZW5kcyBFPiBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRoaXMuc3VmZml4ID0gbmV3IEFycmF5TGlzdDxFPihzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIEUgc3VmZml4KSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggY29udGFpbmluZyBhIHNpbmdsZSBudWxsIGl0ZW0uCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobnVsbCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0SXRlcmF0b3JfKCkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPigKLQkJCXRoaXMucHJlZml4Lmxpc3RJdGVyYXRvcigpLAotCQkJdGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLAotCQkJdGhpcy5zdWZmaXgubGlzdEl0ZXJhdG9yKCkKLQkJKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCWludCBwcmVmaXhTaXplID0gdGhpcy5wcmVmaXguc2l6ZSgpOwotCQlpZiAoaW5kZXggPCBwcmVmaXhTaXplKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmVmaXguZ2V0KGluZGV4KTsKLQkJfSBlbHNlIGlmIChpbmRleCA+PSBwcmVmaXhTaXplICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkgewotCQkJcmV0dXJuIHRoaXMuc3VmZml4LmdldChpbmRleCAtIChwcmVmaXhTaXplICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXggLSBwcmVmaXhTaXplKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZml4LnNpemUoKSArIHRoaXMubGlzdEhvbGRlci5zaXplKCkgKyB0aGlzLnN1ZmZpeC5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCUFycmF5TGlzdDxFPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLnNpemUoKSk7Ci0JCWxpc3QuYWRkQWxsKHRoaXMucHJlZml4KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkQWxsKHRoaXMuc3VmZml4KTsKLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24vb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsgIC8vIG5vdCAiY2xlYXJlZCIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoTGlzdDxFPiBwcmVmaXgpIHsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdWZmaXgoTGlzdDxFPiBzdWZmaXgpIHsKLQkJdGhpcy5zdWZmaXggPSBzdWZmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RT4gYnVpbGRMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SXRlcmF0b3JfKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyOWRjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIEZpbHRlcn0KLSAqIHRvIGRldGVybWluZSB3aGljaCBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiBhcmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIHtAbGluayAjaXRlcmF0b3IoKX0uCi0gKiA8cD4KLSAqIFRoZSBmaWx0ZXIgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgZmlsdGVyIGNyaXRlcmlhIChlLmcuIHdoZW4gdGhlIHVzZXIKLSAqIHdhbnRzIHRvIHZpZXcgYSBsaXN0IG9mIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcykuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IElmIHRoZSBvYmplY3RzIGluIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24gY2FuIGNoYW5nZSBpbiBzdWNoIGEgd2F5Ci0gKiB0aGF0IHRoZXkgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgImZpbHRlcmVkIiBjb2xsZWN0aW9uLCB5b3Ugd2lsbAotICogbmVlZCB0byB3cmFwIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIGluIGFuIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfS4KLSAqIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsdGVyIG9ubHkgImFjY2VwdHMiIGl0ZW1zIHdob3NlIG5hbWVzIGJlZ2luCi0gKiB3aXRoICJYIiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBpdGVtcyBjYW4gY2hhbmdlLCB5b3Ugd2lsbCBuZWVkIHRvCi0gKiB3cmFwIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHVuZmlsdGVyZWQgaXRlbXMgd2l0aCBhbgotICoge0BsaW5rIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdGhhdCBsaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIGVhY2gKLSAqIGl0ZW0ncyBuYW1lIGFuZCBmaXJlcyB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgd2hlbmV2ZXIgYW4gaXRlbSdzIG5hbWUKLSAqIGNoYW5nZXMuIFRoZSBldmVudCB3aWxsIGNhdXNlIHRoaXMgd3JhcHBlciB0byByZS1maWx0ZXIgdGhlIGNoYW5nZWQKLSAqIGl0ZW0gYW5kIGFkZCBvciByZW1vdmUgaXQgZnJvbSB0aGUgImZpbHRlcmVkIiBjb2xsZWN0aW9uIGFzIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhpcyBmaWx0ZXJzIHRoZSBpdGVtcyBpbiB0aGUgbmVzdGVkIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBGaWx0ZXI8RT4gZmlsdGVyOwotCi0JLyoqIENhY2hlIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIGZpbHRlciAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxFPiBmaWx0ZXJlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMoY29sbGVjdGlvbkhvbGRlciwgRmlsdGVyLk51bGwuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obGlzdEhvbGRlciksIGZpbHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuZmlsdGVyZWRJdGVtcyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJlZEl0ZW1zLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGNhY2hlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBjb2xsZWN0aW9uCi0JCXRoaXMuZmlsdGVyZWRJdGVtcy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpbHRlciB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24odGhpcy5maWx0ZXIodGhpcy5nZXRJdGVtcyhldmVudCkpLCB0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyAqbm90KiBmaWx0ZXIgdGhlIHZhbHVlcywgYmVjYXVzZSB0aGV5IG1heSBubyBsb25nZXIgYmUKLQkJLy8gImFjY2VwdGVkIiBhbmQgdGhhdCBtaWdodCBiZSB3aHkgdGhleSB3ZXJlIHJlbW92ZWQgaW4gdGhlIGZpcnN0IHBsYWNlOwotCQkvLyBhbnl3YXksIGFueSBleHRyYW5lb3VzIGl0ZW1zIGFyZSBoYXJtbGVzcwotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oZXZlbnQuZ2V0SXRlbXMoKSwgdGhpcy5maWx0ZXJlZEl0ZW1zLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkRmlsdGVyZWRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZmlsdGVyIGFuZCByZWJ1aWxkIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgZmlsdGVycyB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBmaWx0ZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8RSwgRT4oaXRlbXMsIHRoaXMuZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSBvdXIgY2FjaGUgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCkgewotCQl0aGlzLmZpbHRlcmVkSXRlbXMuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlcikpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIHRoaXMuZmlsdGVyZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5maWx0ZXJlZEl0ZW1zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyMDFkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfQotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIHtAbGluayAjZ2V0VmFsdWUoKX0uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0sIGEgc3ViY2xhc3MKLSAqIGNhbiBvdmVycmlkZSB7QGxpbmsgI2FjY2VwdChUKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgbXVzdCByZXR1cm4gKnNvbWV0aGluZyogYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4gKHtAbGluayAjZ2V0RGVmYXVsdFZhbHVlKCl9KS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxUPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIEZpbHRlcjxUPiBmaWx0ZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIFQgZGVmYXVsdFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI2FjY2VwdChUKX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgRmlsdGVyLkRpc2FibGVkLjxUPmluc3RhbmNlKCksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICNhY2NlcHQoVCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9Ci0JICogPGVtPmFuZDwvZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkKLQkgKiBhIGRlZmF1bHQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlciwgRmlsdGVyPFQ+IGZpbHRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIGZpbHRlciwgYW5kIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyLCBGaWx0ZXI8VD4gZmlsdGVyLCBUIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJWYWx1ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpbHRlciB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlUIGV2ZW50T2xkVmFsdWUgPSAoVCkgZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5maWx0ZXJWYWx1ZShldmVudE9sZFZhbHVlKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVQgZXZlbnROZXdWYWx1ZSA9IChUKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlKGV2ZW50TmV3VmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyAiYWNjZXB0ZWQiIHNpbXBseSByZXR1cm4gaXQsCi0JICogb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBmaWx0ZXJWYWx1ZShUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFjY2VwdCh2YWx1ZSkgPyB2YWx1ZSA6IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBzaG91bGQKLQkgKiByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIGEgY2FsbCB0bwotCSAqIHtAbGluayAjZ2V0VmFsdWUoKX07IHRoZSB2YWx1ZSBjYW1lCi0JICogZnJvbSB0aGUgbmVzdGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgaWYKLQkgKiB0aGUgbmVzdGVkIHZhbHVlIHdhcyByZWplY3RlZCBieSB0aGUgZmlsdGVyLgotCSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBUIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTVjODZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgQmlkaUZpbHRlcn0KLSAqIHRvIGRldGVybWluZSB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkIGJ5IGNhbGxzCi0gKiB0byB7QGxpbmsgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsI2dldFZhbHVlKCkgZ2V0VmFsdWUoKX0gYW5kIG1vZGlmaWVkIGJ5IGNhbGxzIHRvCi0gKiB7QGxpbmsgI3NldFZhbHVlKFQpfS4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0sIGEgc3ViY2xhc3MKLSAqIGNhbiBvdmVycmlkZSB7QGxpbmsgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsI2FjY2VwdChUKSBhY2NlcHQoVCl9IGFuZCB7QGxpbmsgI3JldmVyc2VBY2NlcHQoVCl9LgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIHZhbHVlIG1vZGVsIGlzIHRoYXQKLSAqIGl0IG11c3QgcmV0dXJuICpzb21ldGhpbmcqIGFzIHRoZSB2YWx1ZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKLSAqIHRvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuZXZlciB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgImFjY2VwdGVkIiwKLSAqIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGFuZC9vciBvdmVycmlkZGVuICh7QGxpbmsgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsI2dldERlZmF1bHRWYWx1ZSgpIGdldERlZmF1bHRWYWx1ZSgpfSkuCi0gKiA8cD4KLSAqIFNpbWlsYXJseSwgaWYgYW4gaW5jb21pbmcgdmFsdWUgaXMgbm90ICJyZXZlcnNlIGFjY2VwdGVkIiwgPGVtPm5vdGhpbmc8L2VtPgotICogd2lsbCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIsIG5vdCBldmVuIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI2FjY2VwdChUKX0gYW5kIHtAbGluayAjcmV2ZXJzZUFjY2VwdChUKX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlGaWx0ZXJ9LgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXIuRGlzYWJsZWQuPFQ+aW5zdGFuY2UoKSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjYWNjZXB0KFQpfSBhbmQge0BsaW5rICNyZXZlcnNlQWNjZXB0KFQpfQotCSAqIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0uCi0JICogPGVtPmFuZDwvZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkKLQkgKiBhIGRlZmF1bHQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXIuRGlzYWJsZWQuPFQ+aW5zdGFuY2UoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXI8VD4gZmlsdGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIGZpbHRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgZmlsdGVyLCBhbmQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXI8VD4gZmlsdGVyLCBUIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgZmlsdGVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnJldmVyc2VBY2NlcHQodmFsdWUpKSB7Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZpbHRlcmluZyB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbAotCSAqIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgaW4gYSBjYWxsIHRvCi0JICoge0BsaW5rICNzZXRWYWx1ZShUKX0uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldmVyc2VBY2NlcHQoVCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRGaWx0ZXIoKS5yZXZlcnNlQWNjZXB0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTxUPn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSBiaWRpcmVjdGlvbmFsIGZpbHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQmlkaUZpbHRlcjxUPiBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiAoQmlkaUZpbHRlcjxUPikgdGhpcy5maWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNmRhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGxpc3QgdmFsdWUgbW9kZWwgdGhhdCBwcm92aWRlcyBiZWhhdmlvciBmb3Igd3JhcHBpbmcgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9Ci0gKiAob3Ige0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSkgYW5kIGxpc3RlbmluZyBmb3IgY2hhbmdlcyB0byBhc3BlY3RzIG9mIHRoZQotICogPGVtPml0ZW1zPC9lbT4gaGVsZCBieSB0aGUgbGlzdCAob3IgY29sbGVjdGlvbikuIENoYW5nZXMgdG8gdGhlIGFjdHVhbCBsaXN0Ci0gKiAob3IgY29sbGVjdGlvbikgYXJlIGFsc28gbW9uaXRvcmVkLgotICogCi0gKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGNvbGxlY3Rpb24gb2YgaXRlbXMgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYnkgYWRkaW5nCi0gKiBvciByZW1vdmluZyBpdGVtcyBvciB0aGUgaXRlbXMgdGhlbXNlbHZlcyBtaWdodCBjaGFuZ2UgaW4gYSBmYXNoaW9uIHRoYXQKLSAqIG1pZ2h0IGNoYW5nZSB0aGUgbGlzdCBvciBjb2xsZWN0aW9uJ3MgZXh0ZXJuYWwgYXBwZWFyYW5jZS4KLSAqIAotICogU3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHR3byBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZUl0ZW1fKE1vZGVsKX08cD4KLSAqICAgICBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0gYW5kIGNhbGwKLSAqICAgICB7QGxpbmsgI2l0ZW1Bc3BlY3RDaGFuZ2VkKEV2ZW50T2JqZWN0KX0gd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VJdGVtXyhNb2RlbCl9PHA+Ci0gKiAgICAgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvKioKLQkgKiBNYWludGFpbiBhIGNvdW50ZXIgZm9yIGVhY2ggb2YgdGhlIGl0ZW1zIGluIHRoZQotCSAqIHdyYXBwZWQgbGlzdCBob2xkZXIgd2UgYXJlIGxpc3RlbmluZyB0by4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSWRlbnRpdHlIYXNoTWFwPEUsIEludFJlZmVyZW5jZT4gY291bnRlcnM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmNvdW50ZXJzID0gbmV3IElkZW50aXR5SGFzaE1hcDxFLCBJbnRSZWZlcmVuY2U+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciBhbmQgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLmVuZ2FnZUFsbEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlQWxsSXRlbXMoKSB7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtcyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMpIHsKLQkJZm9yIChFIGl0ZW0gOiBpdGVtcykgewotCQkJdGhpcy5lbmdhZ2VJdGVtKGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbShFIGl0ZW0pIHsKLQkJLy8gbGlzdGVuIHRvIGVhY2ggaXRlbSBvbmx5IG9uY2UKLQkJSW50UmVmZXJlbmNlIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXJzLmdldChpdGVtKTsKLQkJaWYgKGNvdW50ZXIgPT0gbnVsbCkgewotCQkJY291bnRlciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJCXRoaXMuY291bnRlcnMucHV0KGl0ZW0sIGNvdW50ZXIpOwotCQkJdGhpcy5lbmdhZ2VJdGVtXygoTW9kZWwpIGl0ZW0pOwotCQl9Ci0JCWNvdW50ZXIuaW5jcmVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciBhbmQgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbEl0ZW1zKCk7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlQWxsSXRlbXMoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtcyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMpIHsKLQkJZm9yIChFIGl0ZW0gOiBpdGVtcykgewotCQkJdGhpcy5kaXNlbmdhZ2VJdGVtKGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbShFIGl0ZW0pIHsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gZWFjaCBpdGVtIG9ubHkgb25jZQotCQlJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQkvLyBzb21ldGhpbmcgaXMgd3JvbmcgaWYgdGhpcyBoYXBwZW5zLi4uICB+Ymp2Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGNvdW50ZXI6ICIgKyBpdGVtKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChjb3VudGVyLmRlY3JlbWVudCgpID09IDApIHsKLQkJCXRoaXMuY291bnRlcnMucmVtb3ZlKGl0ZW0pOwotCQkJdGhpcy5kaXNlbmdhZ2VJdGVtXygoTW9kZWwpIGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogRm9yd2FyZCB0aGUgZXZlbnQgYW5kIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYWRkZWQgaXRlbXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCQl0aGlzLmVuZ2FnZUl0ZW1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgcmVtb3ZlZCBpdGVtcyBhbmQgZm9yd2FyZCB0aGUgZXZlbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgcmVtb3ZlZCBpdGVtcywgZm9yd2FyZCB0aGUgZXZlbnQsCi0JICogYW5kIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYWRkZWQgaXRlbXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5nZXRPbGRJdGVtcyhldmVudCkpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5nZXROZXdJdGVtcyhldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogTm8gbmVlZCB0byBjaGFuZ2UgYW55IGxpc3RlbmVyczsganVzdCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyB3ZSBzaG91bGQgb25seSBuZWVkIHRvIGRpc2VuZ2FnZSBlYWNoIGl0ZW0gb25jZS4uLgotCQkvLyBtYWtlIGEgY29weSB0byBwcmV2ZW50IGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQlDb2xsZWN0aW9uPEU+IGtleXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuY291bnRlcnMua2V5U2V0KCkpOwotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKGtleXMpOwotCQl0aGlzLmNvdW50ZXJzLmNsZWFyKCk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZCBpbiBzb21lIGRyYW1hdGljIGZhc2hpb24uCi0JICogUmVjb25maWd1cmUgb3VyIGxpc3RlbmVycyBhbmQgZm9yd2FyZCB0aGUgZXZlbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIHNob3VsZCBvbmx5IG5lZWQgdG8gZGlzZW5nYWdlIGVhY2ggaXRlbSBvbmNlLi4uCi0JCS8vIG1ha2UgYSBjb3B5IHRvIHByZXZlbnQgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCUNvbGxlY3Rpb248RT4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5jb3VudGVycy5rZXlTZXQoKSk7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXMoa2V5cyk7Ci0JCXRoaXMuY291bnRlcnMuY2xlYXIoKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCQl0aGlzLmVuZ2FnZUFsbEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZW0gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBpdGVtIGhhcyBhIGJvdW5kIHByb3BlcnR5IHRoYXQgaGFzIGNoYW5nZWQuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlLiBUaGUgbGlzdGVuZXJzIHdpbGwgaGF2ZSB0byBkZXRlcm1pbmUKLQkgKiB3aGV0aGVyIHRoZSBpdGVtIGFzcGVjdCBjaGFuZ2UgaXMgc2lnbmlmaWNhbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbUFzcGVjdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdEhvbGRlci5zaXplKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRhOTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU2ltcGxlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gYWxsIG9mIHRoZSBjaGFuZ2VzCi0gKiBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIGl0ZW1DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHVibGljIEl0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5pdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0uYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThiZjk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGNvbGxlY3Rpb24KLSAqIGFzcGVjdHMgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgaXRlbXMnIGNvbGxlY3Rpb25zIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpdGVtQ29sbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIENvbGxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmNvbGxlY3Rpb25OYW1lcyA9IGNvbGxlY3Rpb25OYW1lczsKLQkJdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1Db2xsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIENvbGxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIGNvbGxlY3Rpb25OYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IGEgQ29sbGVjdGlvbiBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbk5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCWl0ZW0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4YTYwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgbGlzdAotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGxpc3ROYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGl0ZW1MaXN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gTGlzdCBhc3BlY3RzLgotCSAqLwotCXB1YmxpYyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy5pdGVtTGlzdExpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1MaXN0TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIExpc3QgYXNwZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBsaXN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCB0aGUgTGlzdCBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtTGlzdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBsaXN0IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3ROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJaXRlbS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMuaXRlbUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YmQ5OTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0JCXRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjMwMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaXRlbVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgaXRlbSBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuaXRlbVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIGl0ZW0gc3RhdGUuCi0JICovCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1TdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gc3RhdGUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0uYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0ucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTViNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgdHJlZQotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgdHJlZSB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgaXRlbVRyZWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmVlTmFtZXMgPSB0cmVlTmFtZXM7Ci0JCXRoaXMuaXRlbVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtVHJlZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmVlTmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIHRyZWUgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbVRyZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gdHJlZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJaXRlbS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMuaXRlbVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhkZmEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2Yge0BsaW5rIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gcHJvdmlkZXMKLSAqIGJhc2ljIGxpc3QgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGEgc2V0IG9mIG9uZSBvciBtb3JlIGxpc3RzIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjTElTVF9WQUxVRVN9IGxpc3QuCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0pOjx1bD4KLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcl8oKX0KLSAqIDxsaT57QGxpbmsgI2dldChpbnQpfQotICogPGxpPntAbGluayAjc2l6ZV8oKX0KLSAqIDxsaT57QGxpbmsgI3RvQXJyYXlfKCl9Ci0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3IoKX0KLSAqIDxsaT57QGxpbmsgI3NpemUoKX0KLSAqIDxsaT57QGxpbmsgI3RvQXJyYXkoKX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UywgRT4KLXsKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgc3ViamVjdCdzIGxpc3RzIHRoYXQgd2UgdXNlIGZvciB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGxpc3ROYW1lczsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9MSVNUX05BTUVTID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIExpc3RBc3BlY3RBZGFwdGVyKFN0cmluZyBsaXN0TmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHtsaXN0TmFtZX0sIHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gbGlzdE5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBsaXN0TmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgbGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5saXN0TmFtZXMgPSBsaXN0TmFtZXM7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgbGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgQ29sbGVjdGlvbjxTdHJpbmc+IGxpc3ROYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIGxpc3ROYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbGlzdE5hbWVzLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgbGlzdCBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgbGlzdCBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfTElTVF9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIGxpc3QgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGxpc3QgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChMaXN0QXNwZWN0QWRhcHRlci50aGlzLmxpc3ROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NTBmMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5IHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBXZSBrZWVwIGFuIGludGVybmFsIGNvbGxlY3Rpb24gc29tZXdoYXQgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZCBsaXN0LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBsaXN0IHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBsaXN0IHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayBpdGVyYXRvcigpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBjb2xsZWN0aW9uLCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIGNvbGxlY3Rpb24gYW5kIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBsaXN0Ci0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBjb2xsZWN0aW9uIGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJLy8gdHJ5IHRvIHByZXZlbnQgYmFja2Rvb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBsaXN0Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGNvbGxlY3Rpb24gKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY29sbGVjdGlvbiB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlcgotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0T2xkSXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRPbGRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmc/IG1vdmluZyBpdGVtcyBpbiBhIGxpc3QgaGFzIG5vIG5ldCBlZmZlY3Qgb24gYSBjb2xsZWN0aW9uLi4uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIHB1dCBpbiBlbXB0eSBjaGVjayBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyB1bm5lY2Vzc2FyaWx5Ci0JCWlmICggISB0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFZBTFVFUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgY29sbGVjdGlvbiB3aXRoIHRoZSB3cmFwcGVkIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0SG9sZGVyLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIHRoaXMuY29sbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb2xsZWN0aW9uKCkgewotCQkvLyBpZiB0aGUgbmV3IGxpc3QgaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbihzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29sbGVjdGlvbihpbnQgc2l6ZSkgewotCQl0aGlzLmNvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb24uYWRkKGVhY2gpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzJiYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RBZGFwdGVyfSBwcm92aWRlcyBsaXN0IGNoYW5nZSBzdXBwb3J0Ci0gKiBieSBhZGFwdGluZyBhIHN1YmplY3QncyBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHRvIGEgbWluaW11bSBzZXQKLSAqIG9mIGxpc3QgY2hhbmdlIGV2ZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RDdXJhdG9yPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIEhvdyB0aGUgbGlzdCBsb29rZWQgYmVmb3JlIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEU+IHJlY29yZDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyBmb3IgdGhlIHN1YmplY3QncyBzdGF0ZSB0byBjaGFuZ2UgKi8KLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY3VyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q3VyYXRvcihTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjdXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnJlY29yZCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBzdGF0ZSBoYXMgY2hhbmdlZCwgZG8gaW52ZW50b3J5IGFuZCByZXBvcnQgdG8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q3VyYXRvci50aGlzLnN1Ym1pdEludmVudG9yeVJlcG9ydCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RhdGUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLnJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTElTVF9WQUxVRVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYXNwZWN0IGhhcyBjaGFuZ2VkLCBub3RpZnkgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMucmVjb3JkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIGFkZCBvdXIgbGlzdGVuZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnJlY29yZCwgdGhpcy5pdGVyYXRvckZvclJlY29yZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIHJlbW92ZSBvdXIgbGlzdGVuZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdAotCQl0aGlzLnJlY29yZC5jbGVhcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0Q3VyYXRvciBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGRpZmZlcmVudCBmcm9tIHtAbGluayBMaXN0VmFsdWVNb2RlbCNpdGVyYXRvcigpfS4KLQkgKiBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgc3ViamVjdCBjaGFuZ2VzIG9yIHRoZQotCSAqIHN1YmplY3QncyAic3RhdGUiIGNoYW5nZXMgKGFzIHNpZ25pZmllZCBieSBhIHN0YXRlIGNoYW5nZSBldmVudCkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPEU+IGl0ZXJhdG9yRm9yUmVjb3JkKCk7Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0Jdm9pZCBzdWJtaXRJbnZlbnRvcnlSZXBvcnQoKSB7Ci0JCUxpc3Q8RT4gbmV3UmVjb3JkID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5pdGVyYXRvckZvclJlY29yZCgpKTsKLQkJaW50IHJlY29yZEluZGV4ID0gMDsKLQotCQkvLyBhZGQgaXRlbXMgZnJvbSB0aGUgbmV3IHJlY29yZAotCQlmb3IgKEUgbmV3SXRlbSA6IG5ld1JlY29yZCkgewotCQkJdGhpcy5pbnZlbnRvcnlOZXdJdGVtKHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJCXJlY29yZEluZGV4Kys7Ci0JCX0KLQotCQkvLyBjbGVhbiBvdXQgaXRlbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBuZXcgcmVjb3JkCi0JCWZvciAocmVjb3JkSW5kZXggPSAwOyByZWNvcmRJbmRleCA8IHRoaXMucmVjb3JkLnNpemUoKTsgKSB7Ci0JCQlFIGl0ZW0gPSB0aGlzLnJlY29yZC5nZXQocmVjb3JkSW5kZXgpOwotCi0JCQlpZiAobmV3UmVjb3JkLmNvbnRhaW5zKGl0ZW0pKSB7Ci0JCQkJcmVjb3JkSW5kZXgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUludmVudG9yeShyZWNvcmRJbmRleCwgaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW52ZW50b3J5TmV3SXRlbShpbnQgcmVjb3JkSW5kZXgsIEUgbmV3SXRlbSkgewotCQlMaXN0PEU+IHJlYyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5yZWNvcmQpOwotCi0JCWlmICgocmVjb3JkSW5kZXggPCByZWMuc2l6ZSgpKSAmJiByZWMuZ2V0KHJlY29yZEluZGV4KS5lcXVhbHMobmV3SXRlbSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVjLmNvbnRhaW5zKG5ld0l0ZW0pKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tSW52ZW50b3J5KHJlY29yZEluZGV4LCByZWMuZ2V0KHJlY29yZEluZGV4KSk7Ci0JCQl0aGlzLmludmVudG9yeU5ld0l0ZW0ocmVjb3JkSW5kZXgsIG5ld0l0ZW0pOwotCQl9IGVsc2UgewotCQkJdGhpcy5hZGRJdGVtVG9JbnZlbnRvcnkocmVjb3JkSW5kZXgsIG5ld0l0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW1Ub0ludmVudG9yeShpbnQgaW5kZXgsIEUgaXRlbSkgewotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGl0ZW0sIHRoaXMucmVjb3JkLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUl0ZW1Gcm9tSW52ZW50b3J5KGludCBpbmRleCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgaXRlbSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5yZWNvcmQsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnJlY29yZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY4ZjlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGxpc3QgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGxpc3QgdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM0MTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYW5vdGhlciBsaXN0IHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBwcm9wYWdhdGUKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUKLSAqIHtAbGluayBMaXN0VmFsdWVNb2RlbH0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TGlzdFZhbHVlTW9kZWwKLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0T2xkSXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRPbGRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDk5MDc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgcmVhZC1vbmx5IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91Ci0gKiBkb24ndCBuZWVkIHRvIHN1cHBvcnQgYSBjb2xsZWN0aW9uLiBJbiBwYXJ0aWN1bGFyLCB0aGlzCi0gKiBpcyB1c2VmdWwgZm9yIHRoZSBsZWFmIG5vZGVzIG9mIGEgdHJlZSB0aGF0IG5ldmVyIGhhdmUKLSAqIGNoaWxkcmVuLgotICogPHA+Ci0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDM1YmFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGVtcHR5IGxpc3QgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91IGRvbid0Ci0gKiBuZWVkIHRvIHN1cHBvcnQgYSBsaXN0LgotICogPHA+Ci0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIEVNUFRZX0FSUkFZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDQ4M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgcHJvcGVydHkgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91Ci0gKiBkb24ndCBuZWVkIHRvIHN1cHBvcnQgYSB2YWx1ZS4KLSAqIDxwPgotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiYTcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgdHJlZSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhbnkgbm9kZXMuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFRyZWVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogVHJlZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y3Yjc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGEgc2V0IG9mIG9uZSBvciBtb3JlIHN0YW5kYXJkIHByb3BlcnRpZXMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRX0gcHJvcGVydHkuCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfQotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9Ci0gKiA8bGk+e0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIFY+Ci0JZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFMsIFY+Ci17Ci0JLyoqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydGllcyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1BST1BFUlRZX05BTUVTID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBvZiB0aGUgc3ViamVjdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHByb3BlcnR5LgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHtwcm9wZXJ0eU5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHByb3BlcnR5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgcHJvcGVydHkgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIHByb3BlcnR5IGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBwcm9wZXJ0eS4gKEEge0BsaW5rIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsfSBjb3VsZCBhbHNvIGJlCi0JICogdXNlZCBpbiB0aGlzIHNpdHVhdGlvbi4pCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9QUk9QRVJUWV9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHByb3BlcnR5IGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQyODBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGNvbGxlY3Rpb24KLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCUUgZXZlbnROZXdWYWx1ZSA9IChFKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50TmV3VmFsdWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgdmFsdWUgd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZQotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoRSBuZXdWYWx1ZSkgewotCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJLy8gd2Ugd291bGRuJ3QgZ2V0IHRoZSBldmVudCBpZiB0aGUgbmV3IHZhbHVlIHdlcmUgbnVsbCB0b28KLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBvbGRWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIHdvdWxkbid0IGdldCB0aGUgZXZlbnQgaWYgdGhlIG5ldyB2YWx1ZSB3YXMgdGhlIHNhbWUgYXMgdGhlIG9sZAotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ld1ZhbHVlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2M1YjE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TGlzdFZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGxpc3QKLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgdmFsdWUgYW5kIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB2YWx1ZSBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogbGlzdCBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQkJRSBldmVudE5ld1ZhbHVlID0gKEUpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnROZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkKLQkJCQk6Ci0JCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyB0aGlzLmJ1aWxkSU9PQkUoaW5kZXgsIDApOwotCQl9Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCXRocm93IHRoaXMuYnVpbGRJT09CRShpbmRleCwgMSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBFTVBUWV9PQkpFQ1RfQVJSQVkgOiBuZXcgT2JqZWN0W10ge3RoaXMudmFsdWV9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBidWlsZElPT0JFKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJcmV0dXJuIG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogIiArIHNpemUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCB2YWx1ZSB3aXRoIHRoZSB3cmFwcGVkIHZhbHVlCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChFIG5ld1ZhbHVlKSB7Ci0JCUUgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9WQUxVRVMsIDAsIG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIDAsIG9sZFZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfVkFMVUVTLCAwLCBuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTJmNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBwcm9wYWdhdGUKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUKLSAqIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICN2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsCi17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFY+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLiBUaGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzg3MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGFjdHVhbGx5Ci0gKiAuLi4gPGVtPmlzbid0PC9lbT4gLi4uIHdyaXRhYmxlLiAgSXQgY2FuIGhvd2V2ZXIgYmUgdXNlZCBpbiBwbGFjZXMgdGhhdCByZXF1aXJlIGEgCi0gKiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB3aGVyZSB0aGUgZGV2ZWxvcGVyIGlzIHN1cmUgdGhhdCBubyAKLSAqIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIHdyaXRlIHRvIGl0LgotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JcHVibGljIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTYyYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+U2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHJldHVybnMgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uCi0gKiBvbmx5IG9uY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgZmluYWwgSGFzaEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJhZywgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBjYWNoZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbgotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPihldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCWludCB1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuYmFnLmFkZChpdGVtKTsKLQkJCWlmICh0aGlzLmJhZy51bmlxdWVDb3VudCgpID4gdW5pcXVlQ291bnQpIHsKLQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJYWRkZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCQlpbnQgdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpZiAodGhpcy5iYWcucmVtb3ZlKGl0ZW0pKSB7Ci0JCQkJaWYgKHRoaXMuYmFnLnVuaXF1ZUNvdW50KCkgPCB1bmlxdWVDb3VudCkgewotCQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJCXJlbW92ZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGl0ZW06ICIgKyBpdGVtKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5iYWcsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgbmV3IEhhc2hTZXQ8RT4odGhpcy5iYWcpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NhYjhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbn0KLSAqIHRoYXQgc2ltcGx5IGhvbGRzIGEgY29sbGVjdGlvbiBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4sIENvbGxlY3Rpb248RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggYW4gZW1wdHkgaW5pdGlhbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEl0ZXJhdG9yPEU+KHRoaXMuY29sbGVjdGlvbi5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHRoZSBjb2xsZWN0aW9uJ3MgZWxlbWVudHMgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuY29sbGVjdGlvbiwgdmFsdWVzKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VCBleHRlbmRzIE9iamVjdD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi50b0FycmF5KGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihvLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihvLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvIGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgJiYgKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PikpIHsKLQkJCUNvbGxlY3Rpb248RT4gYzEgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24pOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlDb2xsZWN0aW9uPEU+IGMyID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oKChDb2xsZWN0aW9uPEU+KSBvKS5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjMS5lcXVhbHMoYzIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uKS5oYXNoQ29kZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhdG9yICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBUIG5leHQ7Ci0KLQkJTG9jYWxJdGVyYXRvcihJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCB0aGlzLm5leHQpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTEwOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBhbmQge0BsaW5rIExpc3R9IHRoYXQgc2ltcGx5IGhvbGRzIGEKLSAqIGxpc3QgYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBvZiBhbnkgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsPEU+LCBMaXN0PEU+Ci17Ci0JLyoqIFRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0PEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoTGlzdDxFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIGFuIGVtcHR5IGluaXRpYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdDxFPigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsSXRlcmF0b3I8RT4odGhpcy5saXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgbGlzdCdzIGVsZW1lbnRzIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RWYWx1ZXMoSXRlcmFibGU8RT4gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIGxpc3QpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBPYmplY3Q+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheShhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0xpc3QobywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChvLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5jbGVhckxpc3QodGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobyBpbnN0YW5jZW9mIExpc3Q8Pz4pICYmIChvIGluc3RhbmNlb2YgTGlzdFZhbHVlTW9kZWw8Pz4pKSB7Ci0JCQlMaXN0PEU+IGwxID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0KTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGlzdDxFPiBsMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdDxFPikgbykuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gbDEuZXF1YWxzKGwyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5zZXRJdGVtSW5MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGFzdEluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0Lmxpc3RJdGVyYXRvcihpbmRleCkpOwotCX0KLQotCXB1YmxpYyBMaXN0PEU+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJLy8gVE9ETyBobW1tICB+Ymp2Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vdmUgYSBzaW5nbGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGEgc3ViLWxpc3Qgb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLm1vdmVJdGVtc0luTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgcmFuZ2Ugb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgTGlzdDxFPiBlbGVtZW50cykgewotCQl0aGlzLnNldEl0ZW1zSW5MaXN0KGluZGV4LCBlbGVtZW50cywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXRlcmF0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBUIG5leHQ7Ci0KLQkJTG9jYWxJdGVyYXRvcihJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCQl0aGlzLmluZGV4Kys7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0OwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIHRoaXMuaW5kZXgsIHRoaXMubmV4dCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0SXRlcmF0b3I8VD4gaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8VD4gewotCQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBpbnQgbGFzdCA9IC0xOwotCQlwcml2YXRlIGludCBuZXh0ID0gMDsKLQkJcHJpdmF0ZSBUIGN1cnJlbnQ7Ci0KLQkJTG9jYWxMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5leHQoKSB7Ci0JCQl0aGlzLmN1cnJlbnQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCXRoaXMubGFzdCA9IHRoaXMubmV4dCsrOwotCQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBwcmV2aW91cygpIHsKLQkJCXRoaXMuY3VycmVudCA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXRoaXMubGFzdCA9IC0tdGhpcy5uZXh0OwotCQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgc2V0KFQgbykgewotCQkJdGhpcy5pdGVyYXRvci5zZXQobyk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIHRoaXMubGFzdCwgbywgdGhpcy5jdXJyZW50KTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgYWRkKFQgbykgewotCQkJdGhpcy5pdGVyYXRvci5hZGQobyk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9WQUxVRVMsIHRoaXMubmV4dCwgbyk7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgdGhpcy5sYXN0LCB0aGlzLmN1cnJlbnQpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlMTZkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgc2ltcGx5IGhvbGRzIG9uIHRvIGFuCi0gKiBvYmplY3QgYW5kIHVzZXMgaXQgYXMgdGhlIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwoVCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCBhIHN0YXJ0aW5nIHZhbHVlIG9mIG51bGwuCi0JICovCi0JcHVibGljIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRSk7Ci0JfQotCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQlUIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyOTZlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9Ci0gKiAob3Ige0BsaW5rIExpc3RWYWx1ZU1vZGVsfSkgYmVoYXZlIGxpa2UgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9Ci0gKiB0aGF0IGtlZXBzIGl0cyBjb250ZW50cyBzb3J0ZWQgYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotICogPHA+Ci0gKiBUaGUge0BsaW5rIENvbXBhcmF0b3J9IGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHNvcnQgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gc29ydCBhIGxpc3Qgb2YgZmlsZXMgZmlyc3QgYnkgbmFtZSwgdGhlbiBieSBkYXRlLCB0aGVuIGJ5IHNpemUpLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlCi0gKiB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqIAotICogQHNlZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKgotCSAqIEEgY29tcGFyYXRvciB1c2VkIGZvciBzb3J0aW5nIHRoZSBlbGVtZW50czsKLQkgKiBpZiBpdCBpcyBudWxsLCB3ZSB1c2UgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXByb3RlY3RlZCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTb3J0IHRoZSBpbnRlcm5hbCBsaXN0IGJlZm9yZSB0aGUgc3VwZXJjbGFzcwotCSAqIHNlbmRzIG91dCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdChpbnQgc2l6ZSkgewotCQlzdXBlci5idWlsZExpc3Qoc2l6ZSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5saXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIHRoZSBsaXN0IHdpbGwgbmVlZCB0byBiZSBzb3J0ZWQgYWZ0ZXIgdGhlIGl0ZW0gaXMgYWRkZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkvLyBmaXJzdCBhZGQgdGhlIGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQlzdXBlci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJLy8gLi4udGhlbiBzb3J0IHRoZSBsaXN0Ci0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBzb3J0IHRoZSBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycywgaWYgbmVjZXNzYXJ5OwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRMaXN0KCkgewotCQkvLyBzYXZlIHRoZSB1bnNvcnRlZCBzdGF0ZSBvZiB0aGUgc29ydGVkIGxpc3Qgc28gd2UgY2FuIG1pbmltaXplIHRoZSBudW1iZXIgb2YgInJlcGxhY2VkIiBpdGVtcwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IHVuc29ydGVkTGlzdCA9IChBcnJheUxpc3Q8RT4pIHRoaXMubGlzdC5jbG9uZSgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMubGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQkJUmFuZ2UgZGlmZlJhbmdlID0gQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKHVuc29ydGVkTGlzdCwgdGhpcy5saXN0KTsKLQkJaWYgKGRpZmZSYW5nZS5zaXplID4gMCkgewotCQkJTGlzdDxFPiB1bnNvcnRlZEl0ZW1zID0gdW5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQlMaXN0PEU+IHNvcnRlZEl0ZW1zID0gdGhpcy5saXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfVkFMVUVTLCBkaWZmUmFuZ2Uuc3RhcnQsIHNvcnRlZEl0ZW1zLCB1bnNvcnRlZEl0ZW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTM5NTYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHdyYXBwZXIgdGhhdCBrZWVwcyB0aGUgY29udGVudHMgb2YgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHNvcnRlZAotICogYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotICogPHA+Ci0gKiBUaGUge0BsaW5rIENvbXBhcmF0b3J9IGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHNvcnQgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gc29ydCBhIGxpc3Qgb2YgZmlsZXMgZmlyc3QgYnkgbmFtZSwgdGhlbiBieSBkYXRlLCB0aGVuIGJ5IHNpemUpLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnQgb2JqZWN0cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICogCi0gKiBAc2VlIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqCi0JICogQSBjb21wYXJhdG9yIHVzZWQgZm9yIHNvcnRpbmcgdGhlIGVsZW1lbnRzOwotCSAqIGlmIGl0IGlzIG51bGwsIHdlIHVzZSAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBsaXN0LCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QsIGJ1dCBrZWVwcyB0aGVtIHNvcnRlZC4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBzb3J0ZWRMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCQl0aGlzLnNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHNvcnRlZCBsaXN0IGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiBiYXNlZCBvbiB0aGUgZWxlbWVudHMnICJuYXR1cmFsIG9yZGVyaW5nIi4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5zb3J0ZWRMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5zb3J0ZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldENvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmNoIHRoZSBzb3J0ZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5idWlsZFNvcnRlZExpc3QoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBzb3J0ZWQgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyCi0JCXRoaXMuc29ydGVkTGlzdC5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkU29ydGVkTGlzdCgpIHsKLQkJLy8gaWYgdGhlIG5ldyBsaXN0IGlzIGVtcHR5LCBkbyBub3RoaW5nCi0JCWludCBzaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMCkgewotCQkJdGhpcy5idWlsZFNvcnRlZExpc3Qoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNvcnRlZExpc3QoaW50IHNpemUpIHsKLQkJdGhpcy5zb3J0ZWRMaXN0LmVuc3VyZUNhcGFjaXR5KHNpemUpOwotCQlmb3IgKEUgZWFjaCA6IHRoaXMubGlzdEhvbGRlcikgewotCQkJdGhpcy5zb3J0ZWRMaXN0LmFkZChlYWNoKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc29ydGVkTGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlyc3QgYWRkIHRoZSBpdGVtcyBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuLi4KLQkJdGhpcy5hZGRJdGVtc1RvTGlzdCh0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCS8vIC4uLnRoZW4gc29ydCB0aGUgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QodGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyBubyBzb3J0aW5nIG5lZWRlZAotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlyc3QgcmVtb3ZlIHRoZSBvbGQgaXRlbXMgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLi4uCi0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCh0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSwgdGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCS8vIHRoZW4gYWRkIHRoZSBuZXcgaXRlbXMgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLi4uCi0JCXRoaXMuYWRkSXRlbXNUb0xpc3QodGhpcy5nZXROZXdJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyAuLi50aGVuIHNvcnQgdGhlIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgCS8vIGRvIG5vdGhpbmcgLSBzb3J0IG9yZGVyIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotICAgIAl0aGlzLmNsZWFyTGlzdCh0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWJ1aWxkIG91ciBzb3J0ZWQgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJaWYgKHRoaXMuc29ydGVkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkvLyBubyBjaGFuZ2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jbGVhckxpc3QodGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5zb3J0ZWRMaXN0LmlzRW1wdHkoKSkgewotCQkJCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KHNpemUpOwotCQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIDAsIHRoaXMuc29ydGVkTGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc29ydGVkTGlzdC5jbGVhcigpOwotCQkJCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KHNpemUpOwotCQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLnNvcnRlZExpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc29ydCB0aGUgc29ydGVkIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLCBpZiBuZWNlc3Nhcnk7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydExpc3QoKSB7Ci0JCS8vIHNhdmUgdGhlIHVuc29ydGVkIHN0YXRlIG9mIHRoZSBzb3J0ZWQgbGlzdCBzbyB3ZSBjYW4gbWluaW1pemUgdGhlIG51bWJlciBvZiAicmVwbGFjZWQiIGl0ZW1zCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlBcnJheUxpc3Q8RT4gdW5zb3J0ZWRMaXN0ID0gKEFycmF5TGlzdDxFPikgdGhpcy5zb3J0ZWRMaXN0LmNsb25lKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5zb3J0ZWRMaXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCQlSYW5nZSBkaWZmUmFuZ2UgPSBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UodW5zb3J0ZWRMaXN0LCB0aGlzLnNvcnRlZExpc3QpOwotCQlpZiAoZGlmZlJhbmdlLnNpemUgPiAwKSB7Ci0JCQlMaXN0PEU+IHVuc29ydGVkSXRlbXMgPSB1bnNvcnRlZExpc3Quc3ViTGlzdChkaWZmUmFuZ2Uuc3RhcnQsIGRpZmZSYW5nZS5lbmQgKyAxKTsKLQkJCUxpc3Q8RT4gc29ydGVkSXRlbXMgPSB0aGlzLnNvcnRlZExpc3Quc3ViTGlzdChkaWZmUmFuZ2Uuc3RhcnQsIGRpZmZSYW5nZS5lbmQgKyAxKTsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9WQUxVRVMsIGRpZmZSYW5nZS5zdGFydCwgc29ydGVkSXRlbXMsIHVuc29ydGVkSXRlbXMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5zb3J0ZWRMaXN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlZGNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCdzIHN0YXRlIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YWJiYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhbiBpdGVyYXRvciBvbiBhIHN0YXRpYyBjb2xsZWN0aW9uLCBidXQgc3RpbGwgYWxsb3dzIGxpc3RlbmVycyB0byBiZSBhZGRlZC4KLSAqIExpc3RlbmVycyB3aWxsIDxlbT5uZXZlcjwvZW0+IGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBub25lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSBjb2xsZWN0aW9uLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEU+KGNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjcyZTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgc3RhdGljIGxpc3QsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEU+IGxpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIFN0YXRpY0xpc3RWYWx1ZU1vZGVsKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RhdGljTGlzdFZhbHVlTW9kZWwoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLmxpc3QuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTEwN2U4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGEgc3RhdGljIHZhbHVlLCBidXQgc3RpbGwgYWxsb3dzIGxpc3RlbmVycyB0byBiZSBhZGRlZC4KLSAqIExpc3RlbmVycyB3aWxsIDxlbT5uZXZlcjwvZW0+IGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBub25lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQkvKiogVGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUIHZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsKFQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzOWUyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVHJlZVZhbHVlTW9kZWx9IHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb24gYSBzdGF0aWMgdHJlZSwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY1RyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgdHJlZSdzIG5vZGVzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbm9kZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IHRyZWUgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZXMuCi0JICovCi0JcHVibGljIFN0YXRpY1RyZWVWYWx1ZU1vZGVsKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBub2RlcykgewotCQlzdXBlcigpOwotCQlpZiAobm9kZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ub2RlcyA9IG5vZGVzOwotCX0KLQotCS8vICoqKioqKioqKiogVHJlZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5ub2Rlcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5vZGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTNjNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gdHJhbnNmb3JtIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfQotICogKG9yIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0pIGludG8gYSByZWFkLW9ubHkge0BsaW5rIExpc3RWYWx1ZU1vZGVsfQotICogd2hvc2UgaXRlbXMgYXJlIHRyYW5mb3JtYXRpb25zIG9mIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZAotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4gSXQgd2lsbCBrZWVwIGl0cyBjb250ZW50cyBpbiBzeW5jaCB3aXRoCi0gKiB0aGUgY29udGVudHMgb2YgdGhlIHdyYXBwZWQge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBhbmQgbm90aWZpZXMgaXRzCi0gKiBsaXN0ZW5lcnMgb2YgYW55IGNoYW5nZXMuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgVHJhbnNmb3JtZXJ9IGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHRyYW5zZm9ybWF0aW9ucy4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTEsIEUyPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RTI+Ci17Ci0KLQkvKiogVGhpcyB0cmFuc2Zvcm1zIHRoZSBpdGVtcywgdW5sZXNzIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMge0BsaW5rICN0cmFuc2Zvcm1JdGVtKE9iamVjdCl9KS4gKi8KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcjsKLQotCS8qKiBUaGUgbGlzdCBvZiB0cmFuc2Zvcm1lZCBpdGVtcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxFMj4gdHJhbnNmb3JtZWRMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIEUyPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIsIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFMT4oY29sbGVjdGlvbkhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEUyPih0aGlzLnRyYW5zZm9ybWVkTGlzdCk7Ci0JfQotCi0JcHVibGljIEUyIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lZExpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lZExpc3QudG9BcnJheSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmNoIHRoZSB0cmFuc2Zvcm1lZCBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuYWRkQWxsKHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5saXN0SG9sZGVyKSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlcgotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGx2bSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyhsdm0sIGx2bS5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLmdldEl0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLmdldEl0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgbmV3IGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1OZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBvbGQgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybU9sZEl0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRPbGRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBpdGVtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVtcywgaW50IHNpemUpIHsKLQkJTGlzdDxFMj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFMj4oc2l6ZSk7Ci0JCWZvciAoRTEgaXRlbSA6IGl0ZW1zKSB7Ci0JCQlyZXN1bHQuYWRkKHRoaXMudHJhbnNmb3JtSXRlbShpdGVtKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm1JdGVtKEUxIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgdHJhbnNmb3JtZXIgYW5kIHJlYnVpbGQgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXIoVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMucmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIG91ciBjYWNoZSB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuYWRkQWxsKHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5saXN0SG9sZGVyKSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogVHJhbnNmb3JtIHRoZW0sIGFkZCB0aGVtIHRvIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0LAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KGV2ZW50LmdldEluZGV4KCksIHRoaXMudHJhbnNmb3JtSXRlbXMoZXZlbnQpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0Ci0JICogYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogUmVwbGFjZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBpbiBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybU5ld0l0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgCXRoaXMubW92ZUl0ZW1zSW5MaXN0KGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIENsZWFyIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotICAgIAl0aGlzLmNsZWFyTGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWJ1aWxkIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzZlZjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLSAqIHRvIHRyYW5zZm9ybSB0aGUgd3JhcHBlZCB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWYWx1ZSgpfS4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LAotICogYSBzdWJjbGFzcyBvZiA8Y29kZT5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gY2FuCi0gKiBlaXRoZXIgb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yLAotICogaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZQotICogaXMgbnVsbCwgb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0uCi0gKiAKLSAqIEBzZWUgVHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VDE+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0gb3Ige0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0KLQkgKiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlciwgVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRUcmFuc2Zvcm1lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JICAgIFQxIGV2ZW50T2xkVmFsdWUgPSAoVDEpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtT2xkKGV2ZW50T2xkVmFsdWUpOwotCSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkgICAgVDEgZXZlbnROZXdWYWx1ZSA9IChUMSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy50cmFuc2Zvcm1OZXcoZXZlbnROZXdWYWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNnZXRWYWx1ZSgpfSwKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybU9sZChUMSl9LCBhbmQKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybU5ldyhUMSl9LgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm0oVDEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVDEgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogQnkgZGVmYXVsdCwgY2FsbCB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50KX0uCi0JICovCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU9sZChUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIEJ5IGRlZmF1bHQsIGNhbGwge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0uCi0JICogVGhpcyBpcyBjYWxsZWQgYnkge0BsaW5rICN2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCl9LgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm1OZXcoVDEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbnVsbC4KLQkgKiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgbnVsbCwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mICN0cmFuc2Zvcm1fKE9iamVjdCkuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCQlwdWJsaWMgVDIgdHJhbnNmb3JtKFQxIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMudHJhbnNmb3JtXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJmNTQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgQmlkaVRyYW5zZm9ybWVyfQotICogdG86PHVsPgotICogPGxpPnRyYW5zZm9ybSB0aGUgd3JhcHBlZCB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWYWx1ZSgpfQotICogPGxpPiJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG5ldyB2YWx1ZSB0aGF0IGNvbWVzIGluIHZpYQotICoge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9OwotICogb3IsIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwgb3IgdGhlIG5ldyB2YWx1ZSBpcyBudWxsLCBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfQotICogYW5kIHtAbGluayAjcmV2ZXJzZVRyYW5zZm9ybShPYmplY3QpfS4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGJpZGkgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyLCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCaWRpVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVDIgdmFsdWUpIHsKLQkJLy8gInJldmVyc2UtdHJhbnNmb3JtIiB0aGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsCi0JCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh0aGlzLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBUMSByZXZlcnNlVHJhbnNmb3JtKFQyIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkucmV2ZXJzZVRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkLCBub24tPGNvZGU+bnVsbDwvY29kZT4sCi0JICogdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBUMSByZXZlcnNlVHJhbnNmb3JtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVDIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+fSwKLQkgKiBzbyB0aGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIHtAbGluayBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPn0sCi0JICogc28gdGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLgotCSAqLwotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBnZXRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIChCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPikgdGhpcy50cmFuc2Zvcm1lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogd3JhcHBlZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGl0IGlzIHRyYW5zZm9ybWVkIGJ5IGEgc3ViY2xhc3MKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0uCi0JICogVGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciB3aWxsIGFsc28gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhlIG5ldyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXQgaXMgcmV2ZXJzZS10cmFuc2Zvcm1lZAotCSAqIGJ5IGEgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdEJpZGlUcmFuc2Zvcm1lcgotCQlleHRlbmRzIERlZmF1bHRUcmFuc2Zvcm1lcgotCQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+Ci0JewotCQlwdWJsaWMgVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucmV2ZXJzZVRyYW5zZm9ybV8odmFsdWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU2MjJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0VHJlZVZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcwotICogYmFzaWMgdHJlZSBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgdHJlZXMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNOT0RFU30gdHJlZS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKHNlZSB0aGUgZGVzY3JpcHRpb25zCi0gKiBpbiB7QGxpbmsgQXNwZWN0VHJlZVZhbHVlTW9kZWxBZGFwdGVyfSk6PHVsPgotICogPGxpPntAbGluayAjbm9kZXNfKCl9Ci0gKiA8bGk+e0BsaW5rICNub2RlcygpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVBc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgdHJlZXMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1RSRUVfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgdHJlZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHRyZWVOYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge3RyZWVOYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihTdHJpbmdbXSB0cmVlTmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIHRyZWVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gdHJlZU5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgdHJlZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0cmVlTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiB0cmVlIGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSB0cmVlIGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyB0cmVlLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9UUkVFX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgdHJlZSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgdHJlZSBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMubm9kZUFkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFRyZWVBc3BlY3RBZGFwdGVyLnRoaXMudHJlZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVOb2RlQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgTk9ERVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTk9ERVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChldmVudC5jbG9uZSh0aGlzLCBOT0RFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChldmVudC5jbG9uZSh0aGlzLCBOT0RFUykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyZmViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHRyZWUgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGNvbGxlY3Rpb24gdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI25vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICN0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHRyZWUgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVWYWx1ZU1vZGVsPD8+IHRyZWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgdHJlZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiB0cmVlIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihUcmVlVmFsdWVNb2RlbDw/PiB0cmVlSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudHJlZUhvbGRlciA9IHRyZWVIb2xkZXI7Ci0JCXRoaXMudHJlZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZUFkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHRyZWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy50cmVlSG9sZGVyLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHJlZUhvbGRlcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB0cmVlIGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVBc3BlY3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVBc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZmZjZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHdyYXBwaW5nIGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfQotICogYW5kIGxpc3RlbmluZyBmb3IgY2hhbmdlcyB0byA8ZW0+YXNwZWN0czwvZW0+IG9mIHRoZSA8ZW0+dmFsdWU8L2VtPiBjb250YWluZWQKLSAqIGJ5IHRoZSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9LiBDaGFuZ2VzIHRvIHRoZSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9J3MKLSAqIHZhbHVlIGFyZSBhbHNvIG1vbml0b3JlZC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSB2YWx1ZSB0aGF0IG1heSBjaGFuZ2UsIGJ1dCB3aG9zZSBhc3BlY3RzIGNhbiBhbHNvCi0gKiBjaGFuZ2UgaW4gYSBmYXNoaW9uIHRoYXQgbWlnaHQgYmUgb2YgaW50ZXJlc3QgdG8gdGhlIGNsaWVudC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gQ2xpZW50cyB3aWxsIG5lZWQgdG8gbGlzdGVuIGZvciB0d28gZGlmZmVyZW50IGNoYW5nZSBub3RpZmljYXRpb25zOgotICogYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSBiZSBmaXJlZCB3aGVuIHRoZSA8ZW0+dmFsdWU8L2VtPiBjaGFuZ2VzOwotICogYSBzdGF0ZSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIGFuIDxlbT5hc3BlY3Q8L2VtPiBvZiB0aGUgdmFsdWUgY2hhbmdlcy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHR3byBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZVZhbHVlXygpfTxwPgotICogICAgIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSB2YWx1ZSBhbmQgY2FsbAotICogICAgIHtAbGluayAjdmFsdWVBc3BlY3RDaGFuZ2VkKCl9IHdoZW5ldmVyIHRoZSBhc3BlY3QgY2hhbmdlcwotICogICAgICh0aGlzIHdpbGwgZmlyZSBhIHN0YXRlIGNoYW5nZSBldmVudCkKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZVZhbHVlXygpfTxwPgotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHZhbHVlCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFY+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotewotCS8qKiBDYWNoZSB0aGUgdmFsdWUgc28gd2UgY2FuIGRpc2VuZ2FnZS4gTnVsbCB1bnRpbCB3ZSBoYXZlIGEgbGlzdGVuZXIqLwotCXByb3RlY3RlZCBWIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlQXNwZWN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGFsbG93IGJvdGggcHJvcGVydHkgYW5kIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IENoYW5nZVN1cHBvcnQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmRpc2VuZ2FnZVZhbHVlKCk7Ci0JCXRoaXMuZW5nYWdlVmFsdWUoKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgZm9yIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHx8IHN1cGVyLmhhc0xpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZW5nYWdlIGFuIGFzcGVjdCBvZiB0aGUgdmFsdWUgbW9kZWwncyB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBkaXNlbmdhZ2UgYW4gYXNwZWN0IG9mIHRoZSB2YWx1ZSBtb2RlbCdzIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZVZhbHVlKCk7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byBhbiBhc3BlY3Qgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gc29tZSBhc3BlY3Qgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgdmFsdWUgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlVmFsdWVfKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byBhbiBhc3BlY3Qgb2YgdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWVfKCk7Ci0JCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgdGhlIHZhbHVlJ3MgYXNwZWN0IGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVBc3BlY3RDaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTxWPn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDg3ZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlNpbXBsZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gYWxsIHRoZSBhc3BlY3RzCi0gKiBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUNoYW5nZUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIHZhbHVlQXNwZWN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoYW5nZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWYWx1ZUNoYW5nZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnZhbHVlQXNwZWN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVBc3BlY3RMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUFzcGVjdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNoYW5nZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogVmFsdWVBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbHVlQXNwZWN0TGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbHVlQXNwZWN0TGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTEyZTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBjb2xsZWN0aW9uCi0gKiBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBjb2xsZWN0aW9ucyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gY29sbGVjdGlvbk5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB2YWx1ZUNvbGxlY3Rpb25MaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgY29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLmNvbGxlY3Rpb25OYW1lcyA9IGNvbGxlY3Rpb25OYW1lczsKLQkJdGhpcy52YWx1ZUNvbGxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgY29sbGVjdGlvbiBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLmNvbGxlY3Rpb25OYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy52YWx1ZUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JkMDM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgbGlzdAotICogYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RBZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgbGlzdHMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGxpc3ROYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgdmFsdWVMaXN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIGxpc3RzLgotCSAqLwotCXB1YmxpYyBWYWx1ZUxpc3RBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5saXN0TmFtZXMgPSBsaXN0TmFtZXM7Ci0JCXRoaXMudmFsdWVMaXN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVMaXN0TGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGxpc3QgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlTGlzdEFkYXB0ZXIudGhpcy5saXN0TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLnZhbHVlTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMudmFsdWVMaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTRiNjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZQotICogcHJvcGVydGllcyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZVByb3BlcnR5QWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIHByb3BlcnRpZXMgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVQcm9wZXJ0eUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBWYWx1ZVByb3BlcnR5QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCQl0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVQcm9wZXJ0eUFkYXB0ZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgcHJvcGVydHkgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMucHJvcGVydHlOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMudmFsdWVQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhNGJhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgdmFsdWUgc3RhdGUuCi0JICovCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlU3RhdGVBZGFwdGVyLnRoaXMuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVUcmVlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTMxMTYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZQotICogdHJlZSBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlVHJlZUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyB0cmVlcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVRyZWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHJlZXMuCi0JICovCi0JcHVibGljIFZhbHVlVHJlZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy52YWx1ZVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZVRyZWVMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVUcmVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy5ub2RlQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSB0cmVlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChWYWx1ZVRyZWVBZGFwdGVyLnRoaXMudHJlZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy52YWx1ZVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnZhbHVlVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZVJlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE0YjQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHNpbmdsZS1lbGVtZW50IHtAbGluayBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICogQWxzbywgb25seSBhIHNpbmdsZS1lbGVtZW50IGNvbGxlY3Rpb24gY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBXcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWltcGxlbWVudHMgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgdG8gYSB3cml0YWJsZQotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIFdyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpIHsKLQkJSXRlcmF0b3I8RT4gc3RyZWFtID0gdmFsdWVzLml0ZXJhdG9yKCk7Ci0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlFIG5ld1ZhbHVlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXNpbmdsZXRvbiBjb2xsZWN0aW9uOiAiICsgdmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8vIG91ciBjb25zdHJ1Y3RvciB0YWtlcyBvbmx5IHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVscwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q1MzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHNpbmdsZS1lbGVtZW50IHtAbGluayBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGxpc3Qgd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICogQWxzbywgb25seSBhIHNpbmdsZS1lbGVtZW50IGxpc3QgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBXcml0YWJsZVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWltcGxlbWVudHMgV3JpdGFibGVMaXN0VmFsdWVNb2RlbDxFPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgdG8gYSB3cml0YWJsZQotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIFdyaXRhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldExpc3RWYWx1ZXMoSXRlcmFibGU8RT4gbGlzdFZhbHVlcykgewotCQlJdGVyYXRvcjxFPiBzdHJlYW0gPSBsaXN0VmFsdWVzLml0ZXJhdG9yKCk7Ci0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlFIG5ld1ZhbHVlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXNpbmdsZXRvbiBsaXN0OiAiICsgbGlzdFZhbHVlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvLyBvdXIgY29uc3RydWN0b3IgdGFrZXMgb25seSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxNGJiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgUHJvcGVydHlWYWx1ZU1vZGVsLgotICogSXQgbGlzdGVucyBmb3IgdGhlIGFwcHJvcHJpYXRlICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8KLSAqIFZBTFVFIHByb3BlcnR5IGNoYW5nZXMuIEl0IGFsc28gYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZQotICogZm9yIHRoZSBQcmVmZXJlbmNlLCB3aGljaCwgYnkgZGVmYXVsdCwgaXMgbnVsbCAoYW5kIGlzIHByb2JhYmx5ICpub3QqIGEgdmVyeQotICogZ29vZCBkZWZhdWx0KS4KLSAqIAotICogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlIGlzIHJldHVybmVkLAotICogdW5jaGFuZ2VkLCBhcyBhIHN0cmluZyBvciBhcyBzb21lIG90aGVyIG9iamVjdCAoZS5nLiBhbiBJbnRlZ2VyKSBieQotICogc2V0dGluZyB0aGUgYWRhcHRlcidzIGNvbnZlcnRlci4gSW50ZXJuYWxseSwgdGhlIHByZWZlcmVuY2UncyB2YWx1ZQotICogaXMgc3RvcmVkIGFzIHRoZSBjb252ZXJ0ZWQgb2JqZWN0OyBhbmQgdGhlIGNvbnZlcnNpb25zIHRha2UgcGxhY2UKLSAqIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIGZyb20gdGhlIHByZWZlcmVuY2VzIG5vZGUgb3IgcmV0cmlldmluZyB0aGUKLSAqIHZhbHVlIGZyb20gYW4gZXZlbnQgZmlyZWQgYnkgdGhlIHByZWZlcmVuY2VzIG5vZGUuCi0gKiAKLSAqIFRoaXMgYWRhcHRlciBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIGFkYXB0ZXJzIGJlY2F1c2UgdGhlCi0gKiBjaGFuZ2UgZXZlbnRzIGZpcmVkIG9mZiBieSBhIFByZWZlcmVuY2VzIG5vZGUgYXJlIGFzeW5jaHJvbm91cyBmcm9tCi0gKiB0aGUgY2hhbmdlIGl0c2VsZi4gKEFic3RyYWN0UHJlZmVyZW5jZXMgdXNlcyBhbiBldmVudCBkaXNwYXRjaCBkYWVtb24uKQotICogQXMgYSByZXN1bHQsIGEgY2xpZW50IGNhbiBzZXQgb3VyIHZhbHVlIHdpdGggI3NldFZhbHVlKE9iamVjdCkgYW5kIHdlCi0gKiB3aWxsIHJldHVybiBmcm9tIHRoYXQgbWV0aG9kIGJlZm9yZSB3ZSBldmVyIHJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20KLSAqIHRoZSBQcmVmZXJlbmNlcyBub2RlIHRoYXQgKml0KiBoYXMgY2hhbmdlZC4gVGhpcyBtZWFucyB3ZSBjYW5ub3QKLSAqIHJlbHkgb24gdGhhdCBldmVudCB0byBrZWVwIG91ciBpbnRlcm5hbGx5IGNhY2hlZCB2YWx1ZSBpbiBzeW5jaC4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQPgotewotCS8qKiBUaGUga2V5IHRvIHRoZSBwcmVmZXJlbmNlIHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcga2V5OwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgKG9iamVjdCkgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgdmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAob2JqZWN0KSB2YWx1ZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHByZWZlcmVuY2UncwotCSAqIHN0cmluZyB2YWx1ZSB0byBhbmQgZnJvbSBhbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXMsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpLCBrZXksIGRlZmF1bHRWYWx1ZSwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmb3JCb29sZWFuKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCWRlZmF1bHRWYWx1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gZm9ySW50ZWdlcihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCUludGVnZXIudmFsdWVPZihkZWZhdWx0VmFsdWUpLAotCQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2UuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5KSB7Ci0JCXRoaXMocHJlZmVyZW5jZXNIb2xkZXIsIGtleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhwcmVmZXJlbmNlc0hvbGRlciwga2V5LCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48UD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlcjxQPiBjb252ZXJ0ZXIpIHsKLQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIpOwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gb3VyIHZhbHVlIGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQSBwcmVmZXJlbmNlIGhhcyBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycyBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBldmVudHMgaW50byBWQUxVRSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucHJlZmVyZW5jZUNoYW5nZWQoZXZlbnQuZ2V0S2V5KCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJlZmVyZW5jZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYWNoZWQgKGNvbnZlcnRlZCkgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBQIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgY2FjaGVkIHZhbHVlLCB0aGVuIHNldCB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoUCB2YWx1ZSkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQlyZXR1cm47CQkvLyBubyBjaGFuZ2VzIGFsbG93ZWQgd2hlbiB3ZSBoYXZlIG5vIGxpc3RlbmVycwotCQl9Ci0KLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHZhbHVlKTsKLQotCQlpZiAoKHRoaXMuc3ViamVjdCAhPSBudWxsKSAmJiB0aGlzLnNob3VsZFNldFByZWZlcmVuY2Uob2xkLCB2YWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQl0aGlzLnN1YmplY3QuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGZvciBzb21lIG9kZCByZWFzb24sIHdlIGFyZSBub3QgYWxsb3dlZCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGEgImRlYWQiCi0JCQkvLyBwcmVmZXJlbmNlcyBub2RlOyBzbyBoYW5kbGUgdGhlIGV4Y2VwdGlvbiB0aGF0IGdldHMgdGhyb3duIGhlcmUKLQkJCWlmICggISBleC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJOb2RlIGhhcyBiZWVuIHJlbW92ZWQuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLCByZS10aHJvdyBpdAotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMua2V5KTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1YmplY3QgbWF5IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFAgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSwgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBQIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9PYmplY3QodGhpcy5zdWJqZWN0LmdldCh0aGlzLmtleSwgdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5kZWZhdWx0VmFsdWUpKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlIGFmdGVyIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgc3RyaW5nLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oUCB2YWx1ZSkgewotCQl0aGlzLnN1YmplY3QucHV0KHRoaXMua2V5LCB0aGlzLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIHNob3VsZCBiZSBwYXNzZWQKLQkgKiB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBCeSBkZWZhdWx0LCBvbmx5IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwKLQkgKiB3aWxsIGl0IGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBUaGlzIGFsc28gaGFzIHRoZQotCSAqIGVmZmVjdCBvZiBub3QgY3JlYXRpbmcgbmV3IHByZWZlcmVuY2VzIGluIHRoZSAiYmFja2luZyBzdG9yZSIKLQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlIGlmIHRoZXkKLQkgKiB3b3VsZCBsaWtlIHRvIEFMV0FZUyBwYXNzIHRocm91Z2ggdGhlIG5ldyB2YWx1ZSB0byB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTZXRQcmVmZXJlbmNlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGFzCi0JICogdGhlIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKFAgbykgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHZhbHVlIHN0cmluZyB0byBhbgotCSAqIGFwcHJvcHJpYXRlbHktdHlwZWQgb2JqZWN0IHRvIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0VG9PYmplY3Qocyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoU3RyaW5nIHByZWZLZXksIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByZWZLZXkuZXF1YWxzKHRoaXMua2V5KSkgewotCQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgcHJlZmVyZW5jZSBjaGFuZ2VkOyBlaXRoZXIgYmVjYXVzZSB3ZSBjaGFuZ2VkIGl0Ci0JICogaW4gI3NldFZhbHVlXyhPYmplY3QpIG9yIGEgdGhpcmQtcGFydHkgY2hhbmdlZCBpdC4KLQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBiZWNhdXNlIG9mIG91ciBvd24gY2hhbmdlLCB0aGUgZXZlbnQgd2lsbCBiZQotCSAqIHN3YWxsb3dlZCBiZWNhdXNlIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDg4MTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciB3cmFwcyBhIFByZWZlcmVuY2VzIG5vZGUgYW5kIGNvbnZlcnRzIGl0cyBwcmVmZXJlbmNlcyBpbnRvIGEKLSAqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIG9mIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxzLiBJdCBsaXN0ZW5zIGZvcgotICogInByZWZlcmVuY2UiIGNoYW5nZXMgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBWQUxVRSBjb2xsZWN0aW9uIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFA+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFByZWZlcmVuY2VzPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4KLXsKLQotCS8qKiBDYWNoZSB0aGUgY3VycmVudCBwcmVmZXJlbmNlcywgc3RvcmVkIGluIG1vZGVscyBhbmQga2V5ZWQgYnkgbmFtZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHByZWZlcmVuY2VzOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlcyBub2RlIGZvciBhZGRlZCBvciByZW1vdmVkIHByZWZlcmVuY2VzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4oKTsKLQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJlZmVyZW5jZXMgaGF2ZSBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHByZWZlcmVuY2UgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50LmdldEtleSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByZWZlcmVuY2UgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBpdGVyYXRvciA9IChJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlcmF0b3IpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCWZvciAoSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gc3RyZWFtID0gdGhpcy5wcmVmZXJlbmNlTW9kZWxzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSBzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5wcmVmZXJlbmNlcy5wdXQocHJlZmVyZW5jZU1vZGVsLmdldEtleSgpLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBmb3Igc29tZSBvZGQgcmVhc29uLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBhICJkZWFkIgotCQkJLy8gcHJlZmVyZW5jZXMgbm9kZTsgc28gaGFuZGxlIHRoZSBleGNlcHRpb24gdGhhdCBnZXRzIHRocm93biBoZXJlCi0JCQlpZiAoICEgZXguZ2V0TWVzc2FnZSgpLmVxdWFscygiTm9kZSBoYXMgYmVlbiByZW1vdmVkLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnByZWZlcmVuY2VzLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gcHJlZmVyZW5jZU1vZGVscygpIHsKLQkJU3RyaW5nW10ga2V5czsKLQkJdHJ5IHsKLQkJCWtleXMgPSB0aGlzLnN1YmplY3Qua2V5cygpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PihuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGtleXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHRyYW5zZm9ybShTdHJpbmcga2V5KSB7Ci0JCQkJcmV0dXJuIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5idWlsZFByZWZlcmVuY2VNb2RlbChrZXkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHR3ZWFrIHRoZSBtb2RlbCB1c2VkIHRvIHdyYXAgdGhlCi0JICogc3BlY2lmaWVkIHByZWZlcmVuY2UgKGUuZy4gdG8gY3VzdG9taXplIHRoZSBtb2RlbCdzIGNvbnZlcnRlcikuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gYnVpbGRQcmVmZXJlbmNlTW9kZWwoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4odGhpcy5zdWJqZWN0SG9sZGVyLCBrZXkpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCS8vIGEgcHJlZmVyZW5jZSB3YXMgcmVtb3ZlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLnByZWZlcmVuY2VzLnJlbW92ZShrZXkpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgaWYgKCAhIHRoaXMucHJlZmVyZW5jZXMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJLy8gYSBwcmVmZXJlbmNlIHdhcyBhZGRlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZU1vZGVsKGtleSk7Ci0JCQl0aGlzLnByZWZlcmVuY2VzLnB1dChrZXksIHByZWZlcmVuY2VNb2RlbCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgewotCQkJLy8gYSBwcmVmZXJlbmNlJ3MgdmFsdWUgY2hhbmdlZCAtIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyYTgzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHByb3ZpZGVkIGJ5IHRoZSBKREsKLSAqICjgIGxhIGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsKS4gVGhpcyBjbGFzcyBwcm92aWRlczoKLSAqIC0gc3VwcG9ydCBmb3IgYSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycwotICogLSBhIG51bWJlciBvZiBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaXJpbmcgZXZlbnRzIGZvciB0aG9zZSBsaXN0ZW5lcnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZU1vZGVsCi0JaW1wbGVtZW50cyBUcmVlTW9kZWwsIFNlcmlhbGl6YWJsZQotewotCS8qKiBPdXIgbGlzdGVuZXJzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0ZW5lckxpc3QgPSBuZXcgRXZlbnRMaXN0ZW5lckxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGFydGlhbCBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MsIGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzLCBsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vZGVsJ3MgY3VycmVudCBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycy4KLQkgKiAoVGhlcmUgc2VlbXMgdG8gYmUgYSBwYXR0ZXJuIG9mIG1ha2luZyB0aGlzIHR5cGUgb2YgbWV0aG9kIHB1YmxpYzsKLQkgKiBhbHRob3VnaCBpdCBzaG91bGQgcHJvYmFibHkgYmUgcHJvdGVjdGVkLi4uLikKLQkgKi8KLQlwdWJsaWMgVHJlZU1vZGVsTGlzdGVuZXJbXSB0cmVlTW9kZWxMaXN0ZW5lcnMoKSB7Ci0gCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVHJlZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQSBzaWduaWZpY2FudCBwcm9wZXJ0eSBvZiB0aGUgbm9kZXMgY2hhbmdlZCwgYnV0IHRoZSBub2RlcyB0aGVtc2VsdmVzCi0JICogYXJlIHN0aWxsIHRoZSBzYW1lIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzQ2hhbmdlZChPYmplY3RbXSBwYXRoLCBpbnRbXSBjaGlsZEluZGljZXMsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCS8vIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0JCVRyZWVNb2RlbEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJLy8gcHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGgtMjsgaT49MDsgaS09MikgewotCQkJaWYgKGxpc3RlbmVyc1tpXT09VHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MpIHsKLQkJCQkvLyBsYXppbHkgY3JlYXRlIHRoZSBldmVudAotCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50ID0gbmV3IFRyZWVNb2RlbEV2ZW50KHRoaXMsIHBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRyZW4pOwotCQkJCX0KLQkJCQkoKFRyZWVNb2RlbExpc3RlbmVyKSBsaXN0ZW5lcnNbaSsxXSkudHJlZU5vZGVzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQSBzaWduaWZpY2FudCBwcm9wZXJ0eSBvZiB0aGUgbm9kZSBjaGFuZ2VkLCBidXQgdGhlIG5vZGUgaXRzZWxmIGlzIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZUNoYW5nZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNDaGFuZ2VkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIHJvb3QgY2hhbmdlZCwgYnV0IHRoZSByb290IGl0c2VsZiBpcyB0aGUgc2FtZSBvYmplY3QuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZVJvb3RDaGFuZ2VkKE9iamVjdCByb290KSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0NoYW5nZWQobmV3IE9iamVjdFtdIHtyb290fSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZXNJbnNlcnRlZChPYmplY3RbXSBwYXRoLCBpbnRbXSBjaGlsZEluZGljZXMsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCS8vIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0JCVRyZWVNb2RlbEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJLy8gcHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGgtMjsgaT49MDsgaS09MikgewotCQkJaWYgKGxpc3RlbmVyc1tpXT09VHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MpIHsKLQkJCQkvLyBsYXppbHkgY3JlYXRlIHRoZSBldmVudAotCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50ID0gbmV3IFRyZWVNb2RlbEV2ZW50KHRoaXMsIHBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRyZW4pOwotCQkJCX0KLQkJCQkoKFRyZWVNb2RlbExpc3RlbmVyKSBsaXN0ZW5lcnNbaSsxXSkudHJlZU5vZGVzSW5zZXJ0ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZUluc2VydGVkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzSW5zZXJ0ZWQocGF0aCwgbmV3IGludFtdIHtjaGlsZEluZGV4fSwgbmV3IE9iamVjdFtdIHtjaGlsZH0pOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzUmVtb3ZlZChPYmplY3RbXSBwYXRoLCBpbnRbXSBjaGlsZEluZGljZXMsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCS8vIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0JCVRyZWVNb2RlbEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJLy8gcHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGgtMjsgaT49MDsgaS09MikgewotCQkJaWYgKGxpc3RlbmVyc1tpXT09VHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MpIHsKLQkJCQkvLyBsYXppbHkgY3JlYXRlIHRoZSBldmVudAotCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50ID0gbmV3IFRyZWVNb2RlbEV2ZW50KHRoaXMsIHBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRyZW4pOwotCQkJCX0KLQkJCQkoKFRyZWVNb2RlbExpc3RlbmVyKSBsaXN0ZW5lcnNbaSsxXSkudHJlZU5vZGVzUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2RlUmVtb3ZlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc1JlbW92ZWQocGF0aCwgbmV3IGludFtdIHtjaGlsZEluZGV4fSwgbmV3IE9iamVjdFtdIHtjaGlsZH0pOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQoT2JqZWN0W10gcGF0aCkgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZVJvb3RSZXBsYWNlZChPYmplY3QgbmV3Um9vdCkgewotCQl0aGlzLmZpcmVUcmVlU3RydWN0dXJlQ2hhbmdlZChuZXcgT2JqZWN0W10ge25ld1Jvb3R9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNmNiZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5CdXR0b25Nb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgSkNoZWNrQm94KSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQKLSAqIGhvbGRzIGEgYm9vbGVhbi4KLSAqIAotICogTWF5YmUgbm90IHRoZSByaWNoZXN0IGNsYXNzIGluIG91ciB0b29sYm94LCBidXQgaXQgd2FzIHRoZQotICogdmljdGltIG9mIHJlZmFjdG9yaW5nLi4uLiAgfmJqdgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlzdXBlcihib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db2x1bW5BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJiNWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db2x1bW5BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZCBieSB0aGUgdGFibGUgbW9kZWwgYWRhcHRlciB0bwotICogY29udmVydCBhIG1vZGVsIG9iamVjdCBpbnRvIHRoZSBtb2RlbHMgdXNlZCBmb3IgZWFjaCBvZgotICogdGhlIGNlbGxzIGZvciB0aGUgb2JqZWN0J3MgY29ycmVzcG9uZGluZyByb3cgaW4gdGhlIHRhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkFkYXB0ZXIgewotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLgotCSAqIFR5cGljYWxseSB0aGlzIGlzIHN0YXRpYy4KLQkgKi8KLQlpbnQgY29sdW1uQ291bnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KLQkgKi8KLQlTdHJpbmcgY29sdW1uTmFtZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KLQkgKi8KLQlDbGFzczw/PiBjb2x1bW5DbGFzcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgZWRpdGFibGUuCi0JICogVHlwaWNhbGx5IHRoaXMgaXMgdGhlIHNhbWUgZm9yIGV2ZXJ5IHJvdy4KLQkgKi8KLQlib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCBtb2RlbHMgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgcm93IGluIHRoZSB0YWJsZS4KLQkgKi8KLQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gY2VsbE1vZGVscyhPYmplY3Qgc3ViamVjdCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2UwYzkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgTGlzdERhdGFMaXN0ZW5lcgotICogKGUuZy4gYSBKQ29tYm9Cb3gpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiBGb3IgY29tYm8gYm94ZXMsIHRoZSBtb2RlbCBvYmplY3QgdGhhdCBob2xkcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMKLSAqIHR5cGljYWxseSBhIGRpZmZlcmVudCBtb2RlbCBvYmplY3QgdGhhbiB0aGUgb25lIHRoYXQgaG9sZHMgdGhlIGNvbGxlY3Rpb24KLSAqIG9mIGNob2ljZXMuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBhIE1XUmVmZXJlbmNlICh0aGUgc2VsZWN0aW9uT3duZXIpIGhhcyBhbiBhdHRyaWJ1dGUKLSAqICJzb3VyY2VUYWJsZSIgKHRoZSBjb2xsZWN0aW9uT3duZXIpCi0gKiB3aGljaCBob2xkcyBvbiB0byBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcy4gV2hlbiB0aGUgc2VsZWN0aW9uCi0gKiBpcyBjaGFuZ2VkIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiBUaGUgaW5oZXJpdGVkIGxpc3QgbW9kZWwgd2lsbCBrZWVwIGl0cyBsaXN0ZW5lcnMgYXdhcmUgb2YgY2hhbmdlcyB0byB0aGUKLSAqIGNvbGxlY3Rpb24gbW9kZWwKLSAqIAotICogSW4gYWRkaXRpb24gdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIHJlcXVpcmVkIGJ5IHRoZSBzdXBlcmNsYXNzLAotICogYW4gaW5zdGFuY2Ugb2YgdGhpcyBDb21ib0JveE1vZGVsIG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhCi0gKiBzZWxlY3Rpb24gaG9sZGVyLCB3aGljaCBpcyBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IHByb3ZpZGVzIGFjY2VzcwotICogdG8gdGhlIHNlbGVjdGlvbiAodHlwaWNhbGx5IGEgUHJvcGVydHlBc3BlY3RBZGFwdGVyKS4KLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBMaXN0TW9kZWxBZGFwdGVyCi0JaW1wbGVtZW50cyBDb21ib0JveE1vZGVsCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyOwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBhbmQgc2VsZWN0aW9uIGhvbGRlciBhcmUgcmVxdWlyZWQ7Ci0JICovCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQlpZiAoc2VsZWN0aW9uSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyID0gc2VsZWN0aW9uSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgYW5kIHNlbGVjdGlvbiBob2xkZXIgYXJlIHJlcXVpcmVkOwotCSAqLwotCXB1YmxpYyBDb21ib0JveE1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJaWYgKHNlbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvbkhvbGRlciA9IHNlbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5zZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlci50aGlzLmZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHNlbGVjdGVkSXRlbSkgewotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZW5nYWdlIHRoZSBzZWxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSB0aGUgc2VsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJLy8gSSBndWVzcyB0aGlzIHdpbGwgd29yay4uLgotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgLTEsIC0xKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGlvbkhvbGRlciArICI6IiArIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQwOWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lckRhdGVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJEYXRlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBkYXRlLgotICogCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgYSBzdWItY2xhc3Mgb2YgU3Bpbm5lckRhdGVNb2RlbCBiZWNhdXNlIG9mIHNvbWUKLSAqIGNyYXBweSBqZGsgY29kZS4uLi4gIH5ianYKLSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIjY3JlYXRlRWRpdG9yKGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbCkKLSAqIAotICogSWYgdGhpcyBjbGFzcyBuZWVkcyB0byBiZSBtb2RpZmllZCwgaXQgd291bGQgYmVob292ZSB1cyB0byByZXZpZXcgdGhlCi0gKiBvdGhlciwgc2ltaWxhciBjbGFzc2VzOgotICogQHNlZSBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotICogQHNlZSBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotCWV4dGVuZHMgU3Bpbm5lckRhdGVNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGRhdGUgdmFsdWUgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGF0ZSBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBkYXRlLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlIGlzIHRoZSBjdXJyZW50IGRhdGUuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlcikgewotCQl0aGlzKGRhdGVIb2xkZXIsIG5ldyBEYXRlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGFuZCBkZWZhdWx0IHZhbHVlIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyLCBEYXRlIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKGRhdGVIb2xkZXIsIG51bGwsIG51bGwsIENhbGVuZGFyLkRBWV9PRl9NT05USCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlIGlzIHRoZSBjdXJyZW50IGRhdGUuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgQ29tcGFyYWJsZTw/PiBzdGFydCwgQ29tcGFyYWJsZTw/PiBlbmQsIGludCBjYWxlbmRhckZpZWxkKSB7Ci0JCXRoaXMoZGF0ZUhvbGRlciwgc3RhcnQsIGVuZCwgY2FsZW5kYXJGaWVsZCwgbmV3IERhdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgQ29tcGFyYWJsZTw/PiBzdGFydCwgQ29tcGFyYWJsZTw/PiBlbmQsIGludCBjYWxlbmRhckZpZWxkLCBEYXRlIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihkYXRlSG9sZGVyLmdldFZhbHVlKCkgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IChEYXRlKSBkYXRlSG9sZGVyLmdldFZhbHVlKCksIHN0YXJ0LCBlbmQsIGNhbGVuZGFyRmllbGQpOwotCQl0aGlzLmRhdGVIb2xkZXIgPSBkYXRlSG9sZGVyOwotCQl0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zeW5jaHJvbml6ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGUgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMuZGF0ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBkYXRlIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZShPYmplY3QpLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuZGF0ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5kYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplKHRoaXMuZGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5kYXRlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRGF0ZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgc3Bpbm5lciBkYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRhdGVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGRlYzM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkF0dHJpYnV0ZVNldDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5FbGVtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUGxhaW5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU2VnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgRG9jdW1lbnRMaXN0ZW5lcgotICogKGUuZy4gYSBKVGV4dEZpZWxkKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBzdHJpbmcuCi0gKiAKLSAqIE5COiBUaGlzIG1vZGVsIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yICJzbWFsbCIgZG9jdW1lbnRzOwotICogaS5lLiBkb2N1bWVudHMgdXNlZCBieSB0ZXh0IGZpZWxkcywgbm90IHRleHQgcGFuZXMuCi0gKiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRG9jdW1lbnQsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIFRoZSBkZWxlZ2F0ZSBkb2N1bWVudCB3aG9zZSBiZWhhdmlvciB3ZSAiZW5oYW5jZSIuICovCi0JcHJvdGVjdGVkIGZpbmFsIERvY3VtZW50IGRlbGVnYXRlOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYmluZWRMaXN0ZW5lciBkZWxlZ2F0ZUxpc3RlbmVyOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3RyaW5nTGlzdGVuZXI7Ci0KLSAgICAvKiogVGhlIGV2ZW50IGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBkb2N1bWVudC4gKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlciwgRG9jdW1lbnQgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN0cmluZ0hvbGRlciA9PSBudWxsIHx8IGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gc3RyaW5nSG9sZGVyOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCXRoaXMuc3RyaW5nTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBzdHJpbmcgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFdyYXAgYSBwbGFpbiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXRoaXMoc3RyaW5nSG9sZGVyLCBuZXcgUGxhaW5Eb2N1bWVudCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdHJpbmdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlci50aGlzLnN0cmluZ0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RyaW5nIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb21iaW5lZExpc3RlbmVyIGJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJbnRlcm5hbExpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERvY3VtZW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVscyBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRMaXN0ZW5lcihEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KERvY3VtZW50TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQkJdGhpcy5lbmdhZ2VTdHJpbmdIb2xkZXIoKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShEb2N1bWVudExpc3RlbmVyLmNsYXNzLCBsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KERvY3VtZW50TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGlzZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCQl0aGlzLmRlbGVnYXRlLnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRVbmRvYWJsZUVkaXRMaXN0ZW5lcihVbmRvYWJsZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5hZGRVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXJMaXN0LmFkZChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKFVuZG9hYmxlRWRpdExpc3RlbmVyLmNsYXNzLCBsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KFVuZG9hYmxlRWRpdExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLnJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0UHJvcGVydHkoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRQcm9wZXJ0eShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5wdXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZyBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShTdHJpbmcpLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLnJlbW92ZShvZmZzZXQsIGxlbik7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnNldFZhbHVlKHRoaXMuZGVsZWdhdGUuZ2V0VGV4dCgwLCB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpKSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRTdHJpbmcoaW50IG9mZnNldCwgU3RyaW5nIGluc2VydGVkU3RyaW5nLCBBdHRyaWJ1dGVTZXQgYSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5pbnNlcnRTdHJpbmcob2Zmc2V0LCBpbnNlcnRlZFN0cmluZywgYSk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnNldFZhbHVlKHRoaXMuZGVsZWdhdGUuZ2V0VGV4dCgwLCB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldFRleHQoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU2VnbWVudCB0eHQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuZ2V0VGV4dChvZmZzZXQsIGxlbmd0aCwgdHh0KTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0U3RhcnRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0U3RhcnRQb3NpdGlvbigpOwotCX0KLQotCXB1YmxpYyBQb3NpdGlvbiBnZXRFbmRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0RW5kUG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gY3JlYXRlUG9zaXRpb24oaW50IG9mZnMpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZVBvc2l0aW9uKG9mZnMpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50W10gZ2V0Um9vdEVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRSb290RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXREZWZhdWx0Um9vdEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldERlZmF1bHRSb290RWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbmRlcihSdW5uYWJsZSByKSB7Ci0JCXRoaXMuZGVsZWdhdGUucmVuZGVyKHIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyW10gZG9jdW1lbnRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIFVuZG9hYmxlRWRpdExpc3RlbmVyW10gdW5kb2FibGVFZGl0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKFVuZG9hYmxlRWRpdExpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQSB0aGlyZCBwYXJ0eSBoYXMgbW9kaWZpZWQgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nLgotCSAqIFN5bmNocm9uaXplIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdHJpbmdDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZURlbGVnYXRlKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGRvY3VtZW50J3MgZW50aXJlIHRleHQgc3RyaW5nIHdpdGggdGhlIG5ldyBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVEZWxlZ2F0ZShTdHJpbmcgcykgewotCQl0cnkgewotCQkJaW50IGxlbiA9IHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGVsZWdhdGUgaGFzIGFscmVhZHkgYmVlbiBzeW5jaHJvbml6ZWQKLQkJCS8vICh2aWEgI2luc2VydFN0cmluZygpIG9yICNyZW1vdmUoKSkKLQkJCWlmICggISB0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgbGVuKS5lcXVhbHMocykpIHsKLQkJCQl0aGlzLmRlbGVnYXRlLnJlbW92ZSgwLCBsZW4pOwotCQkJCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKDAsIHMsIG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOwkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZURlbGVnYXRlKHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpIHsKLQkJdGhpcy5zdHJpbmdIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3RyaW5nTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlQ2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5jaGFuZ2VkVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlSW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCURvY3VtZW50RXZlbnQgZWUgPSBuZXcgSW50ZXJuYWxEb2N1bWVudEV2ZW50KHRoaXMsIGV2ZW50KTsKLQkJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IHRoaXMuZG9jdW1lbnRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLmluc2VydFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZVJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5yZW1vdmVVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVVbmRvYWJsZUVkaXRIYXBwZW5lZChVbmRvYWJsZUVkaXRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJVW5kb2FibGVFZGl0RXZlbnQgZWUgPSBuZXcgVW5kb2FibGVFZGl0RXZlbnQodGhpcywgZXZlbnQuZ2V0RWRpdCgpKTsKLQkJVW5kb2FibGVFZGl0TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLnVuZG9hYmxlRWRpdExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0udW5kb2FibGVFZGl0SGFwcGVuZWQoZWUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RyaW5nSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyByZWFkIGluIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQl0aGlzLnN0cmluZ0xpc3RlbmVyID0gdGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyKCk7Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludGVyZmFjZSBDb21iaW5lZExpc3RlbmVyIGV4dGVuZHMgRG9jdW1lbnRMaXN0ZW5lciwgVW5kb2FibGVFZGl0TGlzdGVuZXIsIFNlcmlhbGl6YWJsZSB7Ci0JCS8vIGp1c3QgY29uc29saWRhdGUgdGhlIHR3byBpbnRlcmZhY2VzCi0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEludGVybmFsTGlzdGVuZXIgaW1wbGVtZW50cyBDb21iaW5lZExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVDaGFuZ2VkVXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVJbnNlcnRVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVJlbW92ZVVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoZXZlbnQpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSW50ZXJuYWxEb2N1bWVudEV2ZW50Ci0JCWV4dGVuZHMgRXZlbnRPYmplY3QKLQkJaW1wbGVtZW50cyBEb2N1bWVudEV2ZW50Ci0JewotCQlwcm90ZWN0ZWQgRG9jdW1lbnRFdmVudCBkZWxlZ2F0ZTsKLQkKLQkJcHJvdGVjdGVkIEludGVybmFsRG9jdW1lbnRFdmVudChEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRFdmVudCBkZWxlZ2F0ZSkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl9Ci0JCXB1YmxpYyBFbGVtZW50Q2hhbmdlIGdldENoYW5nZShFbGVtZW50IGVsZW0pIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldENoYW5nZShlbGVtKTsKLQkJfQotCQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gKERvY3VtZW50KSB0aGlzLnNvdXJjZTsKLQkJfQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcHVibGljIEV2ZW50VHlwZSBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0VHlwZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkY2NlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuTGlzdE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBMaXN0RGF0YUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpMaXN0KSBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwgKG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwpLgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIExpc3RNb2RlbCAqbXVzdCogYmUgc3VwcGxpZWQgd2l0aCBhIHZhbHVlIG1vZGVsLAotICogd2hpY2ggaXMgYSBMaXN0VmFsdWVNb2RlbCBvbiB0aGUgYm91bmQgbGlzdCBvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0gKiBvbiB0aGUgYm91bmQgY29sbGVjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCAtIHRoZSBsaXN0IChvciBjb2xsZWN0aW9uKQotICogaXRzZWxmIGNhbiBiZSBudWxsLCBidXQgdGhlIHZhbHVlIG1vZGVsIHRoYXQgaG9sZHMgaXQgY2Fubm90LgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE1vZGVsQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0TW9kZWwKLXsKLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGxpc3QgZm9yICJkcmFtYXRpYyIgY2hhbmdlcy4KLQkgKiBAc2VlICNsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGludCBsaXN0U2l6ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IgLSBpbml0aWFsaXplIHN0dWZmLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdERhdGFMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8Pz4gbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3REYXRhTGlzdGVuZXJzKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBtb2RlbC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMuc2V0TW9kZWwobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgKz0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgLT0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzdGFydCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWludCBlbmQgPSBzdGFydCArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMTsKLQkJdGhpcy5maXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRUYXJnZXRJbmRleCgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldFRhcmdldEluZGV4KCkpICsgZXZlbnQuZ2V0TGVuZ3RoKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKCkgewotCQlpZiAodGhpcy5saXN0U2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJdGhpcy5saXN0U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzEyMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lckxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSB2YWx1ZQotICogaW4gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTGlzdE1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgcmVhc29uYWJseQotICogaW5leHBlbnNpdmUgI2VxdWFscygpIGltcGxlbWVudGF0aW9uLgotICogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyTGlzdE1vZGVsCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlOyB1c2VkIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgdmFsdWUgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgbW9kZWwgdmFsdWUgaXRzZWxmIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIG5ldyBPYmplY3RbXSB7ZGVmYXVsdFZhbHVlfSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVzLCB2YWx1ZXNbMF0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0W10gdmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEFycmF5cy5hc0xpc3QodmFsdWVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlcywgdmFsdWVzLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlcyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYmVmb3JlIHdlIAotCSAqIGhhdmUgYW55IGxpc3RlbmVycy4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgY3JhcHB5IGpkayBjb2RlIGdldHMgdGhlIHZhbHVlCi0JICogZnJvbSB0aGUgbW9kZWwgKmJlZm9yZSogbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4gIH5ianYKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyLkRlZmF1bHRFZGl0b3IoamF2YXguc3dpbmcuSlNwaW5uZXIpCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIHNvcnJ5IGFib3V0IHRoaXMgImxhdGVyYWwiIGNhbGwgdG8gc3VwZXIgIH5ianYKLQkJCXN1cGVyLnNldFZhbHVlKHRoaXMuc3Bpbm5lclZhbHVlT2YodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBub24tbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNwaW5uZXJWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5zcGlubmVyVmFsdWVPZih2YWx1ZSk7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBzcGlubmVyIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDU2NDQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgQ2hhbmdlTGlzdGVuZXIKLSAqIChlLmcuIGEgSlNwaW5uZXIpIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIG51bWJlci4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJOdW1iZXJNb2RlbCBiZWNhdXNlIG9mIHNvbWUKLSAqIGNyYXBweSBqZGsgY29kZS4uLi4gIH5ianYKLSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIjY3JlYXRlRWRpdG9yKGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbCkKLSAqIAotICogSWYgdGhpcyBjbGFzcyBuZWVkcyB0byBiZSBtb2RpZmllZCwgaXQgd291bGQgYmVob292ZSB1cyB0byByZXZpZXcgdGhlCi0gKiBvdGhlciwgc2ltaWxhciBjbGFzc2VzOgotICogQHNlZSBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotICogQHNlZSBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotCWV4dGVuZHMgU3Bpbm5lck51bWJlck1vZGVsCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlOyB1c2VkIHdoZW4gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbCBudW1iZXIgdmFsdWUgaXMgbnVsbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE51bWJlciBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBudW1iZXIuICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aAotCSAqIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBudW1iZXIuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG51bWJlckNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUgaXMgemVyby4KLQkgKiBUaGUgc3RlcCBzaXplIGlzIG9uZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlcikgewotCQl0aGlzKG51bWJlckhvbGRlciwgMCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgc3RlcCBzaXplIGlzIG9uZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgbnVsbCwgbnVsbCwgSW50ZWdlci52YWx1ZU9mKDEpLCBJbnRlZ2VyLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1pbmltdW0gdmFsdWUgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBpbnQgbWluaW11bSwgaW50IG1heGltdW0sIGludCBzdGVwU2l6ZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgSW50ZWdlci52YWx1ZU9mKG1pbmltdW0pLCBJbnRlZ2VyLnZhbHVlT2YobWF4aW11bSksIEludGVnZXIudmFsdWVPZihzdGVwU2l6ZSksIEludGVnZXIudmFsdWVPZihkZWZhdWx0VmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgbWluaW11bSB2YWx1ZSBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBkb3VibGUgbWluaW11bSwgZG91YmxlIG1heGltdW0sIGRvdWJsZSBzdGVwU2l6ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgbWluaW11bSwgbWF4aW11bSwgc3RlcFNpemUsIG1pbmltdW0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGRvdWJsZSBtaW5pbXVtLCBkb3VibGUgbWF4aW11bSwgZG91YmxlIHN0ZXBTaXplLCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBEb3VibGUudmFsdWVPZihtaW5pbXVtKSwgRG91YmxlLnZhbHVlT2YobWF4aW11bSksIERvdWJsZS52YWx1ZU9mKHN0ZXBTaXplKSwgRG91YmxlLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgQ29tcGFyYWJsZTw/PiBtaW5pbXVtLCBDb21wYXJhYmxlPD8+IG1heGltdW0sIE51bWJlciBzdGVwU2l6ZSwgTnVtYmVyIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihudW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gZGVmYXVsdFZhbHVlIDogKE51bWJlcikgbnVtYmVySG9sZGVyLmdldFZhbHVlKCksIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplKTsKLQkJdGhpcy5udW1iZXJIb2xkZXIgPSBudW1iZXJIb2xkZXI7Ci0JCXRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlcgotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJudW1iZXIgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYmVmb3JlIHdlIAotCSAqIGhhdmUgYW55IGxpc3RlbmVycy4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgY3JhcHB5IGpkayBjb2RlIGdldHMgdGhlIHZhbHVlCi0JICogZnJvbSB0aGUgbW9kZWwgKmJlZm9yZSogbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4gIH5ianYKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyLkRlZmF1bHRFZGl0b3IoamF2YXguc3dpbmcuSlNwaW5uZXIpCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIHNvcnJ5IGFib3V0IHRoaXMgImxhdGVyYWwiIGNhbGwgdG8gc3VwZXIgIH5ianYKLQkJCXN1cGVyLnNldFZhbHVlKHRoaXMuc3Bpbm5lclZhbHVlT2YodGhpcy5udW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbnVtYmVyIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKE9iamVjdCkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy5udW1iZXJIb2xkZXIuc2V0VmFsdWUoKE51bWJlcikgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbnVtYmVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5udW1iZXJIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZSh0aGlzLm51bWJlckhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlciBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLm51bWJlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5udW1iZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTnVtYmVyIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBub24tbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNwaW5uZXJWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5zcGlubmVyVmFsdWVPZih2YWx1ZSk7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBkYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm51bWJlckhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjI0NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFRoaXMgTGlzdFNlbGVjdGlvbk1vZGVsIGlzIGF3YXJlIG9mIHRoZSBMaXN0TW9kZWwgYW5kCi0gKiBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGFjY2VzcyBhbmQgc2V0IHRoZQotICogc2VsZWN0ZWQgKm9iamVjdHMqLCBhcyBvcHBvc2VkIHRvIHRoZSBzZWxlY3RlZCAqaW5kZXhlcyouCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwKLQlleHRlbmRzIERlZmF1bHRMaXN0U2VsZWN0aW9uTW9kZWwKLXsKLQkvKiogVGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0TW9kZWwgbGlzdE1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBsaXN0IG1vZGVsIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdERhdGFMaXN0ZW5lciBsaXN0RGF0YUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHNlbGVjdGlvbiBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwoTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5saXN0RGF0YUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3REYXRhTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0RGF0YUxpc3RlbmVyIGJ1aWxkTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0RGF0YUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW50ZXJ2YWxBZGRlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgaW50ZXJ2YWxSZW1vdmVkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyB0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgc2VsZWN0aW9uCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb250ZW50c0NoYW5nZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC50aGlzLmxpc3RNb2RlbENvbnRlbnRzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGRhdGEgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5LCB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCB3aGVuIHRoZQotCSAqIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGhhdmUgY2hhbmdlZC4gTW9zdCBvZiB0aGUgdGltZSB0aGlzIGp1c3QKLQkgKiBtZWFucyBhbiBpdGVtIGhhcyBjaGFuZ2VkIGluIGEgd2F5IHRoYXQgYWZmZWN0cyBpdHMgZGlzcGxheSBzdHJpbmcKLQkgKiBvciBpY29uLiBXZSB0eXBpY2FsbHkgb25seSB1c2UgdGhlIGNsYXNzIGZvciBlZGl0cyBpbnZvbHZpbmcKLQkgKiBzaW5nbGUgc2VsZWN0aW9uLgotCSAqIEEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBzZWxlY3Rpb24KLQkgKiBzaG91bGQgYmUgY2xlYXJlZCBiZWNhdXNlIGEgY2hhbmdlIGNvdWxkIG1lYW4gdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RNb2RlbENvbnRlbnRzQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdERhdGFFdmVudCBldmVudCkgewotCQkvKip0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ki8KLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFNlbGVjdGlvbk1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihMaXN0U2VsZWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5saXN0TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcih0aGlzLmxpc3REYXRhTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcih0aGlzLmxpc3REYXRhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdFNlbGVjdGlvbkxpc3RlbmVycygpIHsJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdFNlbGVjdGlvbkxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBtb2RlbCByZWZlcmVuY2VkIGJ5IHRoZSBsaXN0IHNlbGVjdGlvbiBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vZGVsIGdldExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdE1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgc2VsZWN0ZWRWYWx1ZXNTaXplKCkgewotCQlpbnQgbWluID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpbnQgbWF4ID0gdGhpcy5nZXRNYXhTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmICgobWluIDwgMCkgfHwgKG1heCA8IDApKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCW4rKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIHZhbHVlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBzZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpIDw9IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBzZWxlY3RlZFZhbHVlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJT2JqZWN0W10gdGVtcCA9IG5ldyBPYmplY3RbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGkpOwotCQkJfQotCQl9Ci0JCWlmIChuID09IG1heFNpemUpIHsKLQkJCS8vIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCS8vIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtuXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIG4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgaW5kaWNlcyBpbiBvcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50W10gc2VsZWN0ZWRJbmRpY2VzKCkgewotCQlpbnQgbWluID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpbnQgbWF4ID0gdGhpcy5nZXRNYXhTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmICgobWluIDwgMCkgfHwgKG1heCA8IDApKSB7Ci0JCQlyZXR1cm4gbmV3IGludFswXTsKLQkJfQotCi0JCWludCBtYXhTaXplID0gKG1heCAtIG1pbikgKyAxOwotCQlpbnRbXSB0ZW1wID0gbmV3IGludFttYXhTaXplXTsKLQkJaW50IG4gPSAwOwotCQlpbnQgY291bnQgPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8PSBtYXg7IGkrKykgewotCQkJaWYgKHRoaXMuaXNTZWxlY3RlZEluZGV4KGkpICYmIChpIDwgY291bnQpKSB7Ci0JCQkJdGVtcFtuKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlBcnJheXMuc29ydCh0ZW1wKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCS8vIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIG4pOwotCQlBcnJheXMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2VsZWN0ZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0U2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKG9iamVjdHMpOwotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0U2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJdGhpcy5zZXRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3Iob2JqZWN0cykpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0VmFsdWVJc0FkanVzdGluZyh0cnVlKTsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKG9iamVjdHMpOwotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3Iob2JqZWN0cykpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsbVNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleE9mKG9iamVjdHMubmV4dCgpLCBsbSwgbG1TaXplKTsKLQkJCXRoaXMucmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW5kZXgsIGluZGV4KTsKLQkJfQotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhvYmplY3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFuY2hvciBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldEFuY2hvclNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRBbmNob3JTZWxlY3Rpb25JbmRleChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgodGhpcy5pbmRleE9mKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldExlYWRTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGxlYWQgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TGVhZFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRMZWFkU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlYWRTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5zZXRMZWFkU2VsZWN0aW9uSW5kZXgodGhpcy5pbmRleE9mKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldE1heFNlbGVjdGlvbkluZGV4KCkKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbWF4IHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldE1pblNlbGVjdGlvbkluZGV4KCkKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbWluIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1pblNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2lzU2VsZWN0ZWRJbmRleChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVJc1NlbGVjdGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLAotCSAqIHdpdGhvdXQgd3JhcHBpbmcgdGhlIGFjdGlvbnMgaW4gImFkanVzdGluZyIgZXZlbnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJTGlzdE1vZGVsIGxtID0gdGhpcy5nZXRMaXN0TW9kZWwoKTsKLQkJaW50IGxpc3RNb2RlbFNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleE9mKG9iamVjdHMubmV4dCgpLCBsbSwgbGlzdE1vZGVsU2l6ZSk7Ci0JCQl0aGlzLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdE1vZGVsIGxtID0gdGhpcy5nZXRMaXN0TW9kZWwoKTsKLQkJcmV0dXJuIHRoaXMuaW5kZXhPZihvYmplY3QsIGxtLCBsbS5nZXRTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggaW4gdGhlIGxpc3QgbW9kZWwgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogUmV0dXJuIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBsaXN0IG1vZGVsLgotCSAqLwotCS8vIHdlJ3JlIGp1c3QgamVya2luZyBhcm91bmQgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGhlcmUKLQkvLyAoaW4gbWVtb3J5IG9mIFBoaWwuLi4pOwotCS8vIGNhbGwgdGhpcyBtZXRob2QgaW5zaWRlIGxvb3BzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgbGlzdE1vZGVsCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0LCBMaXN0TW9kZWwgbG0sIGludCBsaXN0TW9kZWxTaXplKSB7Ci0JCWZvciAoaW50IGkgPSBsaXN0TW9kZWxTaXplOyBpLS0gPiAwOyApIHsKLQkJCWlmIChsbS5nZXRFbGVtZW50QXQoaSkuZXF1YWxzKG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExOTEyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZTsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5NdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTm9kZTsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIFRyZWVNb2RlbCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIHRyZWUgd2l0aCBhICJudWxsIiByb290IHRoYXQKLSAqIGhhcyBhIHNldCBvZiAicHJpbWl0aXZlIiBjaGlsZHJlbi4gVGhlc2UgInByaW1pdGl2ZSIgY2hpbGRyZW4gZG8gbm90IGhhdmUKLSAqIGNoaWxkcmVuIHRoZW1zZWx2ZXMsIG1ha2luZyB0aGUgdHJlZSBhIG1heGltdW0gb2YgMiBsZXZlbHMgZGVlcC4KLSAqIFRoaXMgbW9kZWwgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZXMgdGhlIHJvb3QncyBjaGlsZHJlbiB3aXRoIGEKLSAqIExpc3RWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZSAobm9uLW1vZGVsKSBvYmplY3RzCi0gKiAoZS5nLiBTdHJpbmdzKS4KLSAqIAotICogVGhpcyBpcyB1c2VmdWwgZm9yIHByb3ZpZGluZyBhbiAiZWRpdGFibGUiIGxpc3Qgb2YgcHJpbWl0aXZlcy4gU2luY2UgdGhlIEpESwotICogZG9lcyBub3QgcHJvdmlkZSB1cyB3aXRoIGFuIGVkaXRhYmxlIGxpc3Rib3gsIHdlIG11c3QgdXNlIGFuIGVkaXRhYmxlIHRyZWUuCi0gKiBXZSB3cmFwIGV2ZXJ5dGhpbmcgaW4gRGVmYXVsdE11dGFibGVUcmVlTm9kZXMuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgI3ByaW1pdGl2ZUNoYW5nZWQoaW50LCBPYmplY3QpIGFuZCB1cGRhdGUKLSAqIHRoZSBtb2RlbCBhcHByb3ByaWF0ZWx5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBlZGl0cyB0aGUKLSAqIGxpc3QgZGlyZWN0bHkgYW5kIHByZXNzZXMgPEVudGVyPi4KLSAqIAotICogVGhlIEpUcmVlIHVzaW5nIHRoaXMgbW9kZWwgbXVzdCBiZSBjb25maWd1cmVkIGFzICJlZGl0YWJsZSI6Ci0gKiAJdHJlZS5zZXRFZGl0YWJsZSh0cnVlKTsKLSAqLwotLy8gVE9ETyBjb252ZXJ0IHRvIHVzZSBhbiBhZGFwdGVyIGluc3RlYWQgb2YgcmVxdWlyaW5nIHN1YmNsYXNzCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbAotCWV4dGVuZHMgRGVmYXVsdFRyZWVNb2RlbAotewotCS8qKiBhIG1vZGVsIG9uIHRoZSBsaXN0IG9mIHByaW1pdGl2ZXMgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXI7Ci0KLQkvKiogYSBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgdGhlIGFkZGluZywgcmVtb3ZpbmcsIGFuZCByZXBsYWNpbmcgb2YgdGhlIHByaW1pdGl2ZXMgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKG51bGwsIHRydWUpKTsgIC8vIHRydWUgPSB0aGUgcm9vdCBjYW4gaGF2ZSBjaGlsZHJlbgotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJpbWl0aXZlTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgCi0JICogbW9kZWwgYXBwcm9wcmlhdGVseS4gVGhlIHByaW1pdGl2ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHdhcwotCSAqIGVkaXRlZCBkaXJlY3RseSBieSB0aGUgdXNlciBhbmQgdGhlIG5ldyB2YWx1ZSBpcyBhcyBzcGVjaWZpZWQuCi0JICogQ29udmVydCB0aGUgdmFsdWUgYXBwcm9wcmlhdGVseSBhbmQgcGxhY2UgaXQgaW4gdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByaW1pdGl2ZUNoYW5nZWQoaW50IGluZGV4LCBPYmplY3QgbmV3VmFsdWUpOwotCi0KLQkvLyAqKioqKioqKioqIFRyZWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUgbm9kZSBkaXJlY3RseS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWx1ZUZvclBhdGhDaGFuZ2VkKFRyZWVQYXRoIHBhdGgsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlUcmVlTm9kZSBub2RlID0gKFRyZWVOb2RlKSBwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JCWludCBpbmRleCA9ICgoVHJlZU5vZGUpIHRoaXMuZ2V0Um9vdCgpKS5nZXRJbmRleChub2RlKTsKLQkJdGhpcy5wcmltaXRpdmVDaGFuZ2VkKGluZGV4LCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5nZXRUcmVlTW9kZWxMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QoKTsKLQkJfQotCQlzdXBlci5hZGRUcmVlTW9kZWxMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuZ2V0VHJlZU1vZGVsTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSBvdXIgbGlzdCBvZiBub2RlcyB3aXRoIHRoZSBsaXN0IG9mIHByaW1pdGl2ZXMKLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplTGlzdCgpIHsKLQkJdGhpcy5jbGVhckxpc3QoKTsKLQkJdGhpcy5idWlsZExpc3QoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTGlzdCgpIHsKLQkJaW50IGNoaWxkY291bnQgPSB0aGlzLnJvb3QuZ2V0Q2hpbGRDb3VudCgpOwotCQlmb3IgKGludCBpID0gY2hpbGRjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQl0aGlzLnJlbW92ZU5vZGVGcm9tUGFyZW50KChNdXRhYmxlVHJlZU5vZGUpdGhpcy5yb290LmdldENoaWxkQXQoaSkpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgYnVpbGRMaXN0KCkgewotCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9IHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuYWRkUHJpbWl0aXZlKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByaW1pdGl2ZShPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCXRoaXMuaW5zZXJ0UHJpbWl0aXZlKHRoaXMucm9vdC5nZXRDaGlsZENvdW50KCksIHByaW1pdGl2ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUKLQkgKiBhbmQgaW5zZXJ0IGl0IGFzIGEgY2hpbGQgb2YgdGhlIHJvb3QuCi0JICovCi0Jdm9pZCBpbnNlcnRQcmltaXRpdmUoaW50IGluZGV4LCBPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHByaW1pdGl2ZSwgZmFsc2UpOyAvLyBkb24ndCBhbGxvdyBjaGlsZHJlbiBvbiB0aGUgY2hpbGQgbm9kZQotCQl0aGlzLmluc2VydE5vZGVJbnRvKG5vZGUsIChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JTXV0YWJsZVRyZWVOb2RlIHJlbW92ZU5vZGUoaW50IGluZGV4KSB7Ci0JCU11dGFibGVUcmVlTm9kZSBub2RlID0gKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LmdldENoaWxkQXQoaW5kZXgpOwotCQl0aGlzLnJlbW92ZU5vZGVGcm9tUGFyZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB1c2VyIG9iamVjdCBvZiB0aGUgbm9kZSBhdCBjaGlsZEluZGV4LgotCSAqLwotCXZvaWQgcmVwbGFjZVByaW1pdGl2ZShpbnQgaW5kZXgsIE9iamVjdCBwcmltaXRpdmUpIHsKLQkJTXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QuZ2V0Q2hpbGRBdChpbmRleCk7Ci0JCW5vZGUuc2V0VXNlck9iamVjdChwcmltaXRpdmUpOwotCQl0aGlzLm5vZGVDaGFuZ2VkKG5vZGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCVByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQkJZm9yIChPYmplY3QgaXRlbSA6IGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuaW5zZXJ0UHJpbWl0aXZlKGkrKywgaXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmdldEl0ZW1zU2l6ZSgpOyBpKyspIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMucmVtb3ZlTm9kZShldmVudC5nZXRJbmRleCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQkJZm9yIChPYmplY3QgaXRlbSA6IGV2ZW50LmdldE5ld0l0ZW1zKCkpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMucmVwbGFjZVByaW1pdGl2ZShpKyssIGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8TXV0YWJsZVRyZWVOb2RlPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxNdXRhYmxlVHJlZU5vZGU+KGV2ZW50LmdldExlbmd0aCgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnQuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCXRlbXAuYWRkKFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZW1vdmVOb2RlKGV2ZW50LmdldFNvdXJjZUluZGV4KCkpKTsKLQkJCX0KLQkJCWludCBpID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJCWZvciAoTXV0YWJsZVRyZWVOb2RlIG5vZGUgOiB0ZW1wKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmluc2VydFByaW1pdGl2ZShpKyssIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5jbGVhckxpc3QoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnN5bmNocm9uaXplTGlzdCgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNWM1ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5CdXR0b25Nb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgSlJhZGlvQnV0dG9uKSBpbiBzeW5jaCB3aXRoIGEgKHR5cGljYWxseSBzaGFyZWQpCi0gKiBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBob2xkcyBvbmUgdmFsdWUgb3V0IG9mIGEgc2V0IG9mIHZhbHVlcy4KLSAqIAotICogTk9URTogRG8gKm5vdCogdXNlIHRoaXMgbW9kZWwgd2l0aCBhIEJ1dHRvbkdyb3VwLCBzaW5jZSB0aGUKLSAqIHNoYXJlZCB2YWx1ZSBob2xkZXIgYW5kIHRoZSB3cmFwcGVycyBidWlsdCBieSB0aGlzIGFkYXB0ZXIgd2lsbAotICoga2VlcCB0aGUgYXBwcm9wcmlhdGUgcmFkaW8gYnV0dG9uIGNoZWNrZWQuIEFsc28sIHRoaXMgYWxsb3dzCi0gKiB1cyB0byB1bmNoZWNrIGFsbCB0aGUgcmFkaW8gYnV0dG9ucyBpbiBhIGdyb3VwIHdoZW4gdGhlIHNoYXJlZAotICogdmFsdWUgaXMgbnVsbC4KLSAqLwotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0IGJ1dHRvblZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCXN1cGVyKGJ1aWxkQm9vbGVhbkhvbGRlcih2YWx1ZUhvbGRlciwgYnV0dG9uVmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgdXAgYSBzZXQgb2Ygd3JhcHBlcnMgdGhhdCB3aWxsIGNvbnZlcnQgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGhvbGRlciBhbmQgYnV0dG9uIHZhbHVlIHRvL2Zyb20gYSBib29sZWFuLgotCSAqIAotCSAqIElmIHRoZSB2YWx1ZSBob2xkZXIncyB2YWx1ZSBtYXRjaGVzIHRoZSBidXR0b24gdmFsdWUsCi0JICogdGhlIHdyYXBwZXIgd2lsbCByZXR1cm4gdHJ1ZS4gTGlrZXdpc2UsIGlmIHRoZSB2YWx1ZSBob2xkZXIncwotCSAqIHZhbHVlIGlzIHNldCB0byB0cnVlLCB0aGUgd3JhcHBlciB3aWxsIHNldCB0aGUgdmFsdWUgaG9sZGVyJ3MKLQkgKiB2YWx1ZSB0byB0aGUgYnV0dG9uIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGZpbHRlcmluZ1BWTSA9IG5ldyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KHZhbHVlSG9sZGVyLCBuZXcgUmFkaW9CdXR0b25GaWx0ZXIoYnV0dG9uVmFsdWUpKTsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdCwgQm9vbGVhbj4oZmlsdGVyaW5nUFZNLCBuZXcgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihidXR0b25WYWx1ZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHVzZXIgY2Fubm90IGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbiAtIHRoZSB1c2VyCi0JICogY2FuIG9ubHkgKnNlbGVjdCogYSByYWRpbyBidXR0b24uIE9ubHkgdGhlIG1vZGVsIGNhbgotCSAqIGNhdXNlIGEgcmFkaW8gYnV0dG9uIHRvIGJlIGRlLXNlbGVjdGVkLiBXZSB1c2UgdGhlCi0JICogQVJNRUQgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBiZWluZyBkZS1zZWxlY3RlZAotCSAqIGJ5IHRoZSB1c2VyLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQkvLyBkbyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gZGUtc2VsZWN0IGEgcmFkaW8gYnV0dG9uCi0JCS8vIHJhZGlvIGJ1dHRvbnMgY2FuCi0JCWlmICgoYiA9PSBmYWxzZSkgJiYgdGhpcy5pc0FybWVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRTZWxlY3RlZChiKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGZpbHRlciB3aWxsIG9ubHkgcGFzcyB0aHJvdWdoIGEgbmV3IHZhbHVlIHRvIHRoZSB3cmFwcGVkCi0JICogdmFsdWUgaG9sZGVyIHdoZW4gaXQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSYWRpb0J1dHRvbkZpbHRlciBpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8T2JqZWN0PiB7Ci0JCXByaXZhdGUgT2JqZWN0IGJ1dHRvblZhbHVlOwotCi0JCXB1YmxpYyBSYWRpb0J1dHRvbkZpbHRlcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogYWx3YXlzIHJldHVybiB0aGUgd3JhcHBlZCB2YWx1ZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogcGFzcyB0aHJvdWdoIHRoZSB2YWx1ZSB0byB0aGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbAotCQkgKiAqb25seSogd2hlbiBpdCBtYXRjaGVzIG91ciBidXR0b24gdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpICYmIHZhbHVlLmVxdWFscyh0aGlzLmJ1dHRvblZhbHVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyB0cmFuc2Zvcm1lciB3aWxsIGNvbnZlcnQgdGhlIHdyYXBwZWQgdmFsdWUgdG8gQm9vbGVhbi5UUlVFCi0JICogd2hlbiBpdCBtYXRjaGVzIHRoZSBjb25maWd1cmVkIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBCaWRpVHJhbnNmb3JtZXI8T2JqZWN0LCBCb29sZWFuPiB7Ci0JCXByaXZhdGUgT2JqZWN0IGJ1dHRvblZhbHVlOwotCi0JCXB1YmxpYyBSYWRpb0J1dHRvblRyYW5zZm9ybWVyKE9iamVjdCBidXR0b25WYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnV0dG9uVmFsdWUgPSBidXR0b25WYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBpZiB0aGUgd3JhcHBlZCB2YWx1ZSBtYXRjaGVzIG91ciBidXR0b24gdmFsdWUgcmV0dXJuIHRydWUsCi0JCSAqIGlmIGl0IGlzIHNvbWUgb3RoZXIgdmFsdWUgcmV0dXJuIGZhbHNlOwotCQkgKiBidXQgaWYgaXQgaXMgbnVsbCBzaW1wbHkgcGFzcyBpdCB0aHJvdWdoIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSB0aGUKLQkJICogYnV0dG9uIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkCi0JCSAqLwotCQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZih2YWx1ZS5lcXVhbHModGhpcy5idXR0b25WYWx1ZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGlmIHRoZSBuZXcgdmFsdWUgaXMgdHJ1ZSwgcGFzcyB0aHJvdWdoIHRoZSBvdXIgYnV0dG9uIHZhbHVlOwotCQkgKiBvdGhlcndpc2UgcGFzcyB0aHJvdWdoIG51bGwKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgcmV2ZXJzZVRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSA/IHRoaXMuYnV0dG9uVmFsdWUgOiBudWxsOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjZmMThmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0U3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSB2YWx1ZS4KLSAqIAotICogTm90ZTogaXQgaXMgbGlrZWx5IHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGluc3RlYWQgb2YKLSAqIHRoaXMgb25lOgotICogICAgIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiAgICAgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICogICAgIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiAKLSAqIE5COiBUaGlzIG1vZGVsIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHZhbHVlcyB0aGF0IGhhdmUgYSBmYWlybHkKLSAqIGluZXhwZW5zaXZlICNlcXVhbHMoKSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0KQotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RTcGlubmVyTW9kZWwKLXsKLQkvKiogVGhlIGRlbGVnYXRlIHNwaW5uZXIgbW9kZWwgd2hvc2UgYmVoYXZpb3Igd2UgImVuaGFuY2UiLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyTW9kZWwgZGVsZWdhdGU7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBmb3J3YXJkIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRlbGVnYXRlIHNwaW5uZXIgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIGRlbGVnYXRlTGlzdGVuZXI7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBhbmQgZGVsZWdhdGUgYXJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIFNwaW5uZXJNb2RlbCBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnZhbHVlSG9sZGVyID0gdmFsdWVIb2xkZXI7Ci0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLnZhbHVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVMaXN0ZW5lcigpOwotCQl0aGlzLmRlbGVnYXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGlzIHdpbGwgd3JhcCBhIHNpbXBsZSBudW1iZXIgc3Bpbm5lciBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIG5ldyBTcGlubmVyTnVtYmVyTW9kZWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkVmFsdWVMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBleHBhbmQgYWNjZXNzIGEgYml0IGZvciBpbm5lciBjbGFzcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXIgYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gZm9yd2FyZCB0aGUgZXZlbnQsIHdpdGggdGhpcyBhcyB0aGUgc291cmNlCi0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRlbGVnYXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQl0aGlzLmRlbGVnYXRlLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROZXh0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE5leHRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJldmlvdXNWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0UHJldmlvdXNWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KENoYW5nZUxpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KENoYW5nZUxpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCQl0aGlzLmRlbGVnYXRlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQSB0aGlyZCBwYXJ0eSBoYXMgbW9kaWZpZWQgdGhlIHVuZGVybHlpbmcgdmFsdWUuCi0JICogU3luY2hyb25pemUgdGhlIGRlbGVnYXRlIG1vZGVsIGFjY29yZGluZ2x5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlbGVnYXRlJ3MgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QgdmFsdWUpIHsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmRlbGVnYXRlLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgewotCQkJdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZUhvbGRlcigpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUxpc3RlbmVyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZURlbGVnYXRlKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE4Y2Q1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5BYnN0cmFjdFRhYmxlTW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBUYWJsZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBUYWJsZU1vZGVsTGlzdGVuZXIgKGUuZy4gYSBKVGFibGUpCi0gKiBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIGNvbGxlY3Rpb24gb2YgbW9kZWwgb2JqZWN0cywKLSAqIGVhY2ggb2Ygd2hpY2ggY29ycmVzcG9uZHMgdG8gYSByb3cgaW4gdGhlIHRhYmxlLgotICogVHlwaWNhbGx5LCBlYWNoIGNvbHVtbiBvZiB0aGUgdGFibGUgd2lsbCBiZSBib3VuZCB0byBhIGRpZmZlcmVudCBhc3BlY3QKLSAqIG9mIHRoZSBjb250YWluZWQgbW9kZWwgb2JqZWN0cy4KLSAqIAotICogRm9yIGV4YW1wbGUsIGEgTVdUYWJsZSBoYXMgYW4gYXR0cmlidXRlICdkYXRhYmFzZUZpZWxkcycgdGhhdCBob2xkcwotICogYSBjb2xsZWN0aW9uIG9mIE1XRGF0YWJhc2VGaWVsZHMgdGhhdCB3b3VsZCBjb3JyZXNwb25kIHRvIHRoZSByb3dzIG9mCi0gKiBhIEpUYWJsZTsgYW5kIGVhY2ggTVdEYXRhYmFzZUZpZWxkIGhhcyBhIG51bWJlcgotICogb2YgYXR0cmlidXRlcyAoZS5nLiBuYW1lLCB0eXBlLCBzaXplKSB0aGF0IGNhbiBiZSBib3VuZCB0byB0aGUgY29sdW1ucyBvZgotICogYSByb3cgaW4gdGhlIEpUYWJsZS4gQXMgdGhlc2UgZGF0YWJhc2UgZmllbGRzIGFyZSBhZGRlZCwgcmVtb3ZlZCwgYW5kCi0gKiBjaGFuZ2VkLCB0aGlzIG1vZGVsIHdpbGwga2VlcCB0aGUgbGlzdGVuZXJzIGF3YXJlIG9mIHRoZSBjaGFuZ2VzLgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIFRhYmxlTW9kZWwgbXVzdCBiZSBzdXBwbGllZCB3aXRoIGEKLSAqIGxpc3QgaG9sZGVyIChlLmcuIHRoZSAnZGF0YWJhc2VGaWVsZHMnKSwgd2hpY2ggaXMgYSB2YWx1ZQotICogbW9kZWwgb24gdGhlIGJvdW5kIGNvbGxlY3Rpb24gVGhpcyBpcyByZXF1aXJlZCAtIHRoZQotICogY29sbGVjdGlvbiBpdHNlbGYgY2FuIGJlIG51bGwsIGJ1dCB0aGUgbGlzdCB2YWx1ZSBtb2RlbCB0aGF0Ci0gKiBob2xkcyBpdCBpcyByZXF1aXJlZC4gVHlwaWNhbGx5IHRoaXMgbGlzdCB3aWxsIGJlIHNvcnRlZCAoQHNlZQotICogU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKS4KLSAqIAotICogVGhpcyBUYWJsZU1vZGVsIG11c3QgYWxzbyBiZSBzdXBwbGllZCB3aXRoIGEgQ29sdW1uQWRhcHRlciB0aGF0Ci0gKiB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBoZWFkZXJzLCByZW5kZXJlcnMsIGVkaXRvcnMsIGFuZCBjb250ZW50cwotICogb2YgdGhlIHZhcmlvdXMgY29sdW1ucy4KLSAqIAotICogRGVzaWduIGRlY2lzaW9uOgotICogQ2VsbCBsaXN0ZW5lciBvcHRpb25zIChmcm9tIGxvdyBzcGFjZS9oaWdoIHRpbWUgdG8gaGlnaCBzcGFjZS9sb3cgdGltZSk6Ci0gKiAJLSAxIGNlbGwgbGlzdGVuZXIgbGlzdGVuaW5nIHRvIGV2ZXJ5IGNlbGwgKHRoaXMgaXMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pCi0gKiAJLSAxIGNlbGwgbGlzdGVuZXIgcGVyIHJvdwotICogCS0gMSBjZWxsIGxpc3RlbmVyIHBlciBjZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsCi17Ci0JLyoqCi0JICogYSBsaXN0IG9mIHVzZXIgb2JqZWN0cyB0aGF0IGFyZSBjb252ZXJ0ZWQgdG8KLQkgKiByb3dzIHZpYSB0aGUgY29sdW1uIGFkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyOwotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIGVhY2ggcm93IGlzIGFuIGFycmF5IG9mIGNlbGwgbW9kZWxzCi0JICovCi0JLy8gZGVjbGFyZSBhcyBBcnJheUxpc3Qgc28gd2UgY2FuIHVzZSAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXT4gcm93czsKLQotCS8qKgotCSAqIGNsaWVudC1zdXBwbGllZCBhZGFwdGVyIHRoYXQgcHJvdmlkZXMgd2l0aCB0aGUgdmFyaW91cyBjb2x1bW4KLQkgKiBzZXR0aW5ncyBhbmQgY29udmVydHMgdGhlIG9iamVjdHMgaW4gdGhlIExWTQotCSAqIGludG8gYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcjsKLQotCS8qKgotCSAqIHRoZSBzaW5nbGUgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGV2ZXJ5IGNlbGwncyBtb2RlbAotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjZWxsTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRhYmxlIG1vZGVsIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotCSAqIGFuZCBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgQ29sdW1uQWRhcHRlciBjb2x1bW5BZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMuY29sdW1uQWRhcHRlciA9IGNvbHVtbkFkYXB0ZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnJvd3MgPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXT4oKTsKLQkJdGhpcy5jZWxsTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdGFibGUgbW9kZWwgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3RzCi0JICogYW5kIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgY29sdW1uQWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuYWRkUm93cyhldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVtb3ZlUm93cyhldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlcGxhY2VSb3dzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubW92ZVJvd3MoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmNsZWFyVGFibGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVidWlsZFRhYmxlKCk7Ci0JCQl9Ci0JCQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8T2JqZWN0PiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gKEl0ZXJhYmxlPE9iamVjdD4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JCQl9Ci0JCQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8T2JqZWN0PiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmV0dXJuIChJdGVyYWJsZTxPYmplY3Q+KSBldmVudC5nZXROZXdJdGVtcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRDZWxsTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuY2VsbENoYW5nZWQoKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNlbGwgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0JCXJldHVybiB0aGlzLnJvd3Muc2l6ZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbkFkYXB0ZXIuY29sdW1uTmFtZShjb2x1bW4pOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBDbGFzczw/PiBnZXRDb2x1bW5DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5DbGFzcyhjb2x1bW5JbmRleCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Jc0VkaXRhYmxlKGNvbHVtbkluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMucm93cy5nZXQocm93SW5kZXgpOwotCQlyZXR1cm4gcm93W2NvbHVtbkluZGV4XS5nZXRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlQXQoT2JqZWN0IHZhbHVlLCBpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJvd1tjb2x1bW5JbmRleF0uc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRhYmxlTW9kZWxMaXN0ZW5lcihUYWJsZU1vZGVsTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb1RhYmxlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihUYWJsZU1vZGVsTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc1RhYmxlTW9kZWxMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcy5zZXRNb2RlbChuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVGFibGVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVGFibGVNb2RlbExpc3RlbmVyLmNsYXNzKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGFibGVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RhYmxlTW9kZWxMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgYW5kIHRoZSB2YXJpb3VzIGFzcGVjdHMKLQkgKiBvZiB0aGUgb2JqZWN0cyB0aGF0IG1ha2UgdXAgdGhlIHJvd3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuZW5nYWdlQWxsQ2VsbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBvYmplY3RzIGludG8gcm93cyBhbmQgbGlzdGVuIHRvIHRoZSBjZWxscy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlQWxsQ2VsbHMoKSB7Ci0JCXRoaXMucm93cy5lbnN1cmVDYXBhY2l0eSh0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gc3RyZWFtID0gdGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMuY29sdW1uQWRhcHRlci5jZWxsTW9kZWxzKHN0cmVhbS5uZXh0KCkpOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5hZGQocm93KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgY2VsbHMgaW4gdGhlIHNwZWNpZmllZCByb3cuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZVJvdyhXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93KSB7Ci0JCWZvciAoaW50IGkgPSByb3cubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXJvd1tpXS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jZWxsTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlQWxsQ2VsbHMoKSB7Ci0JCWZvciAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA6IHRoaXMucm93cykgewotCQkJdGhpcy5kaXNlbmdhZ2VSb3cocm93KTsKLQkJfQotCQl0aGlzLnJvd3MuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlUm93KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cpIHsKLQkJZm9yIChpbnQgaSA9IHJvdy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcm93W2ldLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNlbGxMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBicnV0ZS1mb3JjZSBzZWFyY2ggZm9yIHRoZSBjZWxsKHMpIHRoYXQgY2hhbmdlZC4uLgotCSAqLwotCXZvaWQgY2VsbENoYW5nZWQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjZWxsSG9sZGVyKSB7Ci0JCWZvciAoaW50IGkgPSB0aGlzLnJvd3Muc2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IHJvdy5sZW5ndGg7IGotLSA+IDA7ICkgewotCQkJCWlmIChyb3dbal0gPT0gY2VsbEhvbGRlcikgewotCQkJCQl0aGlzLmZpcmVUYWJsZUNlbGxVcGRhdGVkKGksIGopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNvbnZlcnQgdGhlIGl0ZW1zIHRvIHJvd3MKLQkgKi8KLQl2b2lkIGFkZFJvd3MoaW50IGluZGV4LCBpbnQgc2l6ZSwgSXRlcmFibGU8T2JqZWN0PiBpdGVtcykgewotCQlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXT4gbmV3Um93cyA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPihzaXplKTsKLQkJZm9yIChPYmplY3QgaXRlbSA6IGl0ZW1zKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoaXRlbSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJbmV3Um93cy5hZGQocm93KTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKGluZGV4LCBuZXdSb3dzKTsKLQkJdGhpcy5maXJlVGFibGVSb3dzSW5zZXJ0ZWQoaW5kZXgsIGluZGV4ICsgc2l6ZSAtIDEpOwotCX0KLQotCXZvaWQgcmVtb3ZlUm93cyhpbnQgaW5kZXgsIGludCBzaXplKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyh0aGlzLnJvd3MucmVtb3ZlKGluZGV4KSk7Ci0JCX0KLQkJdGhpcy5maXJlVGFibGVSb3dzRGVsZXRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlUm93cyhpbnQgaW5kZXgsIEl0ZXJhYmxlPE9iamVjdD4gaXRlbXMpIHsKLQkJaW50IGkgPSBpbmRleDsKLQkJZm9yIChPYmplY3QgaXRlbSA6IGl0ZW1zKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChpKTsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHJvdyk7Ci0JCQlyb3cgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyhpdGVtKTsKLQkJCXRoaXMuZW5nYWdlUm93KHJvdyk7Ci0JCQl0aGlzLnJvd3Muc2V0KGksIHJvdyk7Ci0JCQlpKys7Ci0JCX0KLQkJdGhpcy5maXJlVGFibGVSb3dzVXBkYXRlZChpbmRleCwgaSAtIDEpOwotCX0KLQotCXZvaWQgbW92ZVJvd3MoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPihsZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0ZW1wLmFkZCh0aGlzLnJvd3MucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJdGhpcy5yb3dzLmFkZEFsbCh0YXJnZXRJbmRleCwgdGVtcCk7Ci0KLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkgKyBsZW5ndGggLSAxOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKHN0YXJ0LCBlbmQpOwotCX0KLQotCXZvaWQgY2xlYXJUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0JfQotCi0Jdm9pZCByZWJ1aWxkVGFibGUoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMGU3NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbi5Ub2dnbGVCdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0ZW5lcgotICogKGUuZy4gYSBKQ2hlY2tCb3ggb3IgYSBKUmFkaW9CdXR0b24pIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIG9uIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgZmFsc2UgKGkuZS4gdGhlIHRvZ2dsZSBidXR0b24gaXMgdW5jaGVja2VkL2VtcHR5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChib29sZWFuSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJ1dHRvbk1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlpZiAodGhpcy5pc1NlbGVjdGVkKCkgIT0gYikgewkvLyBzdG9wIHRoZSByZWN1cnNpb24hCi0JCQlzdXBlci5zZXRTZWxlY3RlZChiKTsvL3B1dCB0aGUgc3VwZXIgY2FsbCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmb2xsb3dpbmcgZ2V0cyBjYWxsZWQgdHdpY2UKLQkJCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoYikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlQWN0aW9uTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZEl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkSXRlbUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVJdGVtTGlzdGVuZXIoSXRlbUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlSXRlbUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgd2UgaGF2ZSBubyBsaXN0ZW5lcnMgYXQgYWxsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudCgpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBJZiBpdCBpcyBudWxsLCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0ZWQoQm9vbGVhbiB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRTZWxlY3RlZCh0aGlzLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0U2VsZWN0ZWQodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBib29sZWFuQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWQoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zZXRTZWxlY3RlZCh0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3MDA2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRyZWVNb2RlbExpc3RlbmVyCi0gKiAoZS5nLiBhIEpUcmVlKSBpbiBzeW5jaCB3aXRoIGEgdHJlZSBvZiBUcmVlTm9kZVZhbHVlTW9kZWwgb2JqZWN0cy4gVW5saWtlCi0gKiBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWwsIHlvdSBkbyBub3QgYWRkIGFuZCByZW1vdmUgbm9kZXMgd2l0aAotICogbWV0aG9kcyBpbXBsZW1lbnRlZCBoZXJlLiBZb3UgY2FuIGFkZCBhbmQgcmVtb3ZlIG5vZGVzIGJ5IGFkZGluZyBhbmQKLSAqIHJlbW92aW5nIHRoZW0gZGlyZWN0bHkgdG8vZnJvbSB0aGUgbm9kZXMgKG9yLCBtb3JlIHR5cGljYWxseSwgdGhlIGRvbWFpbgotICogb2JqZWN0cyB0aGUgbm9kZXMgYXJlIHdyYXBwaW5nIGFuZCBsaXN0ZW5pbmcgdG8pLgotICogCi0gKiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gSlRyZWUsIHRoZSByb290IG9mIHRoZSB0cmVlIGNhbiBuZXZlciBiZSBudWxsLAotICogd2hpY2gsIHR5cGljYWxseSwgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uIChJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGFuIGVtcHR5Ci0gKiB0cmVlIHlvdSBjYW4gc2V0IHRoZSBKVHJlZSdzIHRyZWVNb2RlbCB0byBudWxsLikKLSAqLwotcHVibGljIGNsYXNzIFRyZWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0VHJlZU1vZGVsCi17Ci0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB0cmVlJ3Mgcm9vdCBub2RlIGFuZCBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIGxpc3RlbmVyLiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIHN3YXAgb3V0Ci0JICogdGhlIGVudGlyZSB0cmVlLiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gSlRyZWUsIHRoZSByb290IHNob3VsZAotCSAqIG5ldmVyIGJlIHNldCB0byBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcm9vdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcm9vdExpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYSBub2RlJ3MgaW50ZXJuYWwKLQkgKiAic3RhdGUiIGNoYW5nZXMgKGFzIG9wcG9zZWQgdG8gdGhlIG5vZGUncyB2YWx1ZSBvciBsaXN0IG9mCi0JICogY2hpbGRyZW4pLCBhbGxvd2luZyB1cyB0byBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBub2RlU3RhdGVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGEgbm9kZSdzICJ2YWx1ZSIKLQkgKiBjaGFuZ2VzIChhcyBvcHBvc2VkIHRvIHRoZSBub2RlJ3Mgc3RhdGUgb3IgbGlzdCBvZgotCSAqIGNoaWxkcmVuKSwgYWxsb3dpbmcgdXMgdG8gZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKiBUeXBpY2FsbHksIHRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aXRoIG5vZGVzIHRoYXQgaG9sZAotCSAqIHByaW1pdGl2ZSBkYXRhLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBub2RlVmFsdWVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGFuIHVuZGVybHlpbmcgbm9kZSdzCi0JICogImxpc3QiIG9mIGNoaWxkcmVuIGNoYW5nZXMsIGFsbG93aW5nIHVzIHRvIGtlZXAgb3VyCi0JICogaW50ZXJuYWwgdHJlZSBpbiBzeW5jaCB3aXRoIHRoZSB1bmRlcmx5aW5nIHRyZWUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQotCS8qIHRoZXNlIGF0dHJpYnV0ZXMgbWFrZSB1cCBvdXIgaW50ZXJuYWwgdHJlZSAqLwotCS8qKgotCSAqIFRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzLCB3aGljaCBpcwotCSAqIG1vc3Qgb2YgdGhlIHRpbWUuIFRoZSByb290IGlzIGNhY2hlZCBzbyB3ZSBjYW4gZGlzZW5nYWdlCi0JICogZnJvbSBpdCB3aGVuIGl0IGhhcyBiZWVuIHN3YXBwZWQgb3V0LgotCSAqLwotCXByaXZhdGUgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHJvb3Q7Ci0KLQkvKioKLQkgKiBNYXAgdGhlIG5vZGVzIHRvIHRoZWlyIGxpc3RzIG9mIGNoaWxkcmVuLgotCSAqIFdlIGNhY2hlIHRoZXNlIHNvIHdlIGNhbiBzd2FwIG91dCB0aGUgZW50aXJlIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKiB3aGVuIHdlIHJlY2VpdmUgYSAjbGlzdENoYW5nZWQoKSBldmVudCAod2hpY2ggZG9lcyBub3QgaW5jbHVkZQotCSAqIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWZmZWN0ZWQpLgotCSAqIEBzZWUgRXZlbnRDaGFuZ2VQb2xpY3kjcmVidWlsZENoaWxkcmVuKCkKLQkgKi8KLQlmaW5hbCBJZGVudGl0eUhhc2hNYXA8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+LCBMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4+IGNoaWxkcmVuTGlzdHM7Ci0KLQkvKioKLQkgKiBNYXAgdGhlIGNoaWxkcmVuIG1vZGVscyB0byB0aGVpciBwYXJlbnRzLgotCSAqIFdlIGNhY2hlIHRoZXNlIHNvIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSAicmVhbCIgc291cmNlIG9mIHRoZQotCSAqIGxpc3QgY2hhbmdlIGV2ZW50cyAodGhlIHBhcmVudCkuCi0JICogQHNlZSBFdmVudENoYW5nZVBvbGljeSNwYXJlbnQoKQotCSAqLwotCWZpbmFsIElkZW50aXR5SGFzaE1hcDxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhcmVudHM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgcm9vdC4KLQkgKi8KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiByb290SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChyb290SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucm9vdEhvbGRlciA9IHJvb3RIb2xkZXI7Ci0JCXRoaXMucm9vdExpc3RlbmVyID0gdGhpcy5idWlsZFJvb3RMaXN0ZW5lcigpOwotCQl0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyKCk7Ci0JCXRoaXMubm9kZVZhbHVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5jaGlsZHJlbkxpc3RlbmVyID0gdGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXIoKTsKLQkJdGhpcy5jaGlsZHJlbkxpc3RzID0gbmV3IElkZW50aXR5SGFzaE1hcDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4sIExpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pj4oKTsKLQkJdGhpcy5wYXJlbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcDxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCByb290LgotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiByb290KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KHJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFJvb3RMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yb290Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicm9vdCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGROb2RlVmFsdWVMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlVmFsdWVMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZUNoYW5nZWQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSB2YWx1ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGROb2RlU3RhdGVMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlU3RhdGVMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZUNoYW5nZWQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSBzdGF0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgQWRkRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLmFkZENoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IFJlbW92ZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZW1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IFJlcGxhY2VFdmVudENoYW5nZVBvbGljeShldmVudCkucmVwbGFjZUNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgTW92ZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5tb3ZlQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IENsZWFyRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLmNsZWFyQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCW5ldyBDaGFuZ2VFdmVudENoYW5nZVBvbGljeShldmVudCkucmVidWlsZENoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjaGlsZHJlbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkKE9iamVjdCBwYXJlbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIHBhcmVudCkuY2hpbGQoaW5kZXgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudChPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5jaGlsZHJlblNpemUoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWYoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBub2RlKS5pc0xlYWYoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCB2YWx1ZUZvclBhdGhDaGFuZ2VkKFRyZWVQYXRoIHBhdGgsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpKS5zZXRWYWx1ZSgoVCkgbmV3VmFsdWUpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBpbnQgZ2V0SW5kZXhPZkNoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIHBhcmVudCkuaW5kZXhPZkNoaWxkKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRUcmVlTW9kZWxMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgcm9vdCBhbmQgYWxsIHRoZSBvdGhlciBub2RlcwotCSAqIGluIHRoZSB1bmRlcmx5aW5nIHRyZWUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnJvb3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucm9vdExpc3RlbmVyKTsKLQkJdGhpcy5yb290ID0gdGhpcy5yb290SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmICh0aGlzLnJvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CS8vIHRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzCi0JCX0KLQkJdGhpcy5lbmdhZ2VOb2RlKHRoaXMucm9vdCk7Ci0JCXRoaXMuYWRkUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcm9vdCBhbmQgYWxsIG9mIHRoZSBub2RlcyB0byB0aGUgdW5kZXJseWluZyB0cmVlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSb290KCkgewotCQl0aGlzLmFkZE5vZGUoMCwgdGhpcy5yb290KTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgcm9vdCBhbmQgYWxsIHRoZSBvdGhlcgotCSAqIG5vZGVzIGluIHRoZSB1bmRlcmx5aW5nIHRyZWUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnJlbW92ZVJvb3QoKTsKLQkJdGhpcy5kaXNlbmdhZ2VOb2RlKHRoaXMucm9vdCk7Ci0JCXRoaXMucm9vdCA9IG51bGw7Ci0JCXRoaXMucm9vdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5yb290TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcm9vdCBhbmQgYWxsIG9mIHRoZSBub2RlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJvb3QoKSB7Ci0JCXRoaXMucmVtb3ZlTm9kZSgwLCB0aGlzLnJvb3QpOwotCX0KLQotCS8qKgotCSAqIFRoZSByb290IGhhcyBiZWVuIHN3YXBwZWQuCi0JICogVGhpcyBtZXRob2QgaXMgYSBiaXQgZ25hcmx5IGJlY2F1c2UgdGhlIEFQSSBmb3Igbm90aWZ5aW5nIGxpc3RlbmVycwotCSAqIHRoYXQgdGhlIHJvb3QgaGFzIGNoYW5nZWQgaXMgYSBiaXQgaW5jb25zaXN0ZW50IHdpdGggdGhhdCB1c2VkIGZvcgotCSAqIG5vbi1yb290IG5vZGVzLgotCSAqLwotCXZvaWQgcm9vdENoYW5nZWQoKSB7Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBuZXdSb290ID0gdGhpcy5yb290SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmIChuZXdSb290ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwkvLyB0aGUgcm9vdCBjYW5ub3QgYmUgbnVsbCB3aGlsZSB3ZSBoYXZlIGxpc3RlbmVycwotCQl9Ci0JCS8vIHJlbW92ZSBhbGwgdGhlIGN1cnJlbnQgcm9vdCdzIGNoaWxkcmVuIGZyb20gdGhlIHRyZWUKLQkJLy8gYW5kIHJlbW92ZSB0aGUgaXQgZnJvbSB0aGUgaW50ZXJuYWwgdHJlZQotCQl0aGlzLnJlbW92ZVJvb3QoKTsgCi0KLQkJLy8gc2F2ZSB0aGUgb2xkIHJvb3QgYW5kIHN3YXAgaW4gdGhlIG5ldyByb290Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBvbGRSb290ID0gdGhpcy5yb290OwotCQl0aGlzLnJvb3QgPSBuZXdSb290OwotCi0JCS8vIHdlIG11c3QgYmUgbGlzdGVuaW5nIHRvIGJvdGggdGhlIG9sZCBhbmQgbmV3IHJvb3RzIHdoZW4gd2UgZmlyZSB0aGUgZXZlbnQKLQkJLy8gYmVjYXVzZSB0aGVpciB2YWx1ZXMgY2FuIGJlIGFmZmVjdGVkIGJ5IHdoZXRoZXIgdGhleSBoYXZlIGxpc3RlbmVycwotCQl0aGlzLmVuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5maXJlVHJlZVJvb3RSZXBsYWNlZCh0aGlzLnJvb3QpOwotCQkvLyBub3cgd2UgY2FuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgcm9vdAotCQl0aGlzLmRpc2VuZ2FnZU5vZGUob2xkUm9vdCk7Ci0KLQkJLy8gYWRkIHRoZSBuZXcgcm9vdCB0byB0aGUgaW50ZXJuYWwgdHJlZSBhbmQKLQkJLy8gYWRkIGFsbCBpdHMgY2hpbGRyZW4gdG8gdGhlIHRyZWUgYWxzbwotCQl0aGlzLmFkZFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBFaXRoZXIgdGhlICJ2YWx1ZSIgb3IgdGhlICJzdGF0ZSIgb2YgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBjaGFuZ2VkLAotCSAqIGZvcndhcmQgbm90aWZpY2F0aW9uIHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBub2RlQ2hhbmdlZChUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSkgewotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50ID0gbm9kZS5wYXJlbnQoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVUcmVlUm9vdENoYW5nZWQobm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmZpcmVUcmVlTm9kZUNoYW5nZWQocGFyZW50LnBhdGgoKSwgcGFyZW50LmluZGV4T2ZDaGlsZChub2RlKSwgbm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW4gdG8gdGhlIG5vZGVzLCBub3RpZnkgb3VyIGxpc3RlbmVycyB0aGF0IHRoZSBub2RlcyB3ZXJlIGFkZGVkLAotCSAqIGFuZCB0aGVuIGFkZCB0aGUgbm9kZXMgdG8gb3VyIGludGVybmFsIHRyZWUuCi0JICogV2UgbXVzdCBsaXN0ZW4gdG8gdGhlIG5vZGVzIGJlZm9yZSBub3RpZnlpbmcgYW55Ym9keSwgYmVjYXVzZQotCSAqIGFkZGluZyBhIGxpc3RlbmVyIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgbm9kZS4KLQkgKi8KLQl2b2lkIGFkZENoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRyZW4pIHsKLQkJaW50IGxlbiA9IGNoaWxkSW5kaWNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRoaXMuZW5nYWdlTm9kZShjaGlsZHJlbltpXSk7Ci0JCX0KLQkJdGhpcy5maXJlVHJlZU5vZGVzSW5zZXJ0ZWQocGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZHJlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRoaXMuYWRkTm9kZShjaGlsZEluZGljZXNbaV0sIGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VOb2RlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5vZGUuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyKTsKLQkJbm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ub2RlVmFsdWVMaXN0ZW5lcik7Ci0JCW5vZGUuY2hpbGRyZW5Nb2RlbCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5vZGUgdG8gb3VyIGludGVybmFsIHRyZWU7Ci0JICogdGhlbiByZWN1cnNlIGRvd24gdGhyb3VnaCB0aGUgbm9kZSdzIGNoaWxkcmVuLAotCSAqIGFkZGluZyB0aGVtIHRvIHRoZSBpbnRlcm5hbCB0cmVlIGFsc28uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoaW50IGluZGV4LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSkgewotCQl0aGlzLmFkZE5vZGVUb0ludGVybmFsVHJlZShub2RlLnBhcmVudCgpLCBpbmRleCwgbm9kZSwgbm9kZS5jaGlsZHJlbk1vZGVsKCkpOwotCQluZXcgTm9kZUNoYW5nZVBvbGljeShub2RlKS5hZGRDaGlsZHJlbigpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG5vZGUgdG8gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGVUb0ludGVybmFsVHJlZShUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50LCBpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlLCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTW9kZWwpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHNpYmxpbmdzID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlpZiAoc2libGluZ3MgPT0gbnVsbCkgewotCQkJc2libGluZ3MgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4oKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocGFyZW50LCBzaWJsaW5ncyk7Ci0JCX0KLQkJc2libGluZ3MuYWRkKGluZGV4LCBub2RlKTsKLQotCQl0aGlzLnBhcmVudHMucHV0KGNoaWxkcmVuTW9kZWwsIG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBub2RlcyBmcm9tIG91ciBpbnRlcm5hbCB0cmVlLCBub3RpZnkgb3VyIGxpc3RlbmVycyB0aGF0IHRoZQotCSAqIG5vZGVzIHdlcmUgcmVtb3ZlZCwgdGhlbiBzdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZXMuCi0JICogV2UgbXVzdCBsaXN0ZW4gdG8gdGhlIG5vZGVzIHVudGlsIGFmdGVyIG5vdGlmeWluZyBhbnlib2R5LCBiZWNhdXNlCi0JICogcmVtb3ZpbmcgYSBsaXN0ZW5lciBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIG5vZGUuCi0JICovCi0Jdm9pZCByZW1vdmVDaGlsZHJlbihUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoLCBpbnRbXSBjaGlsZEluZGljZXMsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkcmVuKSB7Ci0JCWludCBsZW4gPSBjaGlsZEluZGljZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkvLyB0aGUgaW5kaWNlcyBzbGlkZSBkb3duIGEgbm90Y2ggZWFjaCB0aW1lIHdlIHJlbW92ZSBhIGNoaWxkCi0JCQl0aGlzLnJlbW92ZU5vZGUoY2hpbGRJbmRpY2VzW2ldIC0gaSwgY2hpbGRyZW5baV0pOwotCQl9Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc1JlbW92ZWQocGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZHJlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRoaXMuZGlzZW5nYWdlTm9kZShjaGlsZHJlbltpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaXJzdCwgcmVjdXJzZSBkb3duIHRocm91Z2ggdGhlIG5vZGUncyBjaGlsZHJlbiwKLQkgKiByZW1vdmluZyB0aGVtIGZyb20gb3VyIGludGVybmFsIHRyZWU7Ci0JICogdGhlbiByZW1vdmUgdGhlIG5vZGUgaXRzZWxmIGZyb20gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoaW50IGluZGV4LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSkgewotCQluZXcgTm9kZUNoYW5nZVBvbGljeShub2RlKS5yZW1vdmVDaGlsZHJlbigpOwotCQl0aGlzLnJlbW92ZU5vZGVGcm9tSW50ZXJuYWxUcmVlKG5vZGUucGFyZW50KCksIGluZGV4LCBub2RlLCBub2RlLmNoaWxkcmVuTW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIG91ciBpbnRlcm5hbCB0cmVlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlRnJvbUludGVybmFsVHJlZShUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50LCBpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlLCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTW9kZWwpIHsKLQkJdGhpcy5wYXJlbnRzLnJlbW92ZShjaGlsZHJlbk1vZGVsKTsKLQotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCXNpYmxpbmdzLnJlbW92ZShpbmRleCk7Ci0JCWlmIChzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5yZW1vdmUocGFyZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCQlub2RlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCXZvaWQgbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCUFycmF5TGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4obGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJdGVtcC5hZGQoY2hpbGRyZW5MaXN0LnJlbW92ZShzb3VyY2VJbmRleCkpOwotCQl9Ci0JCWNoaWxkcmVuTGlzdC5hZGRBbGwodGFyZ2V0SW5kZXgsIHRlbXApOwotCi0JCXRoaXMuZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKHBhcmVudC5wYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucm9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29hbGVzY2Ugc29tZSBvZiB0aGUgY29tbW9uIGNoYW5nZSBwb2xpY3kgYmVoYXZpb3IuCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgQ2hhbmdlUG9saWN5IHsKLQotCQlDaGFuZ2VQb2xpY3koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIGFkZENoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCXZvaWQgcmVtb3ZlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMucmVtb3ZlQ2hpbGRyZW4odGhpcy5wYXJlbnQoKS5wYXRoKCksIHRoaXMuY2hpbGRJbmRpY2VzKCksIHRoaXMuY2hpbGRBcnJheSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGluZGljZXMgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLAotCQkgKiB3aGljaCBzaG91bGQgYmUgY29udGlndW91cy4KLQkJICovCi0JCWludFtdIGNoaWxkSW5kaWNlcygpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkSW5kaWNlcyh0aGlzLmNoaWxkcmVuU3RhcnRJbmRleCgpLCB0aGlzLmNoaWxkcmVuU2l6ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSgpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkodGhpcy5nZXRDaGlsZHJlbigpLCB0aGlzLmNoaWxkcmVuU2l6ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBCdWlsZCBhbiBhcnJheSB0byBob2xkIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCQkgKiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHNvbWV0aGluZyBpcyBzY3Jld2VkIHVwLi4uCi0JCSAqLwotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBidWlsZEFycmF5KEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZWxlbWVudHMsIGludCBzaXplKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGFycmF5ID0gbmV3IFRyZWVOb2RlVmFsdWVNb2RlbFtzaXplXTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJCWFycmF5W2krK10gPSBlbGVtZW50OwotCQkJfQotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB6ZXJvIGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHNpemUpIHsKLQkJCXJldHVybiBidWlsZEluZGljZXMoMCwgc2l6ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGEgc2V0IG9mIGluZGljZXMsIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggYW5kCi0JCSAqIGNvbnRpbnVpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc2l6ZS4KLQkJICovCi0JCWludFtdIGJ1aWxkSW5kaWNlcyhpbnQgc3RhcnQsIGludCBzaXplKSB7Ci0JCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtzaXplXTsKLQkJCWludCBpbmRleCA9IHN0YXJ0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpbmRpY2VzW2ldID0gaW5kZXgrKzsKLQkJCX0KLQkJCXJldHVybiBpbmRpY2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBmb3IgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJYWJzdHJhY3QgaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJYWJzdHJhY3QgaW50IGNoaWxkcmVuU2l6ZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJYWJzdHJhY3QgSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpOwotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RFdmVudCBmb3IgYWRkaW5nLCByZW1vdmluZywgcmVwbGFjaW5nLAotCSAqIGFuZCBjaGFuZ2luZyBjaGlsZHJlbi4KLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIENoYW5nZVBvbGljeSB7Ci0JCWZpbmFsIExpc3RFdmVudCBldmVudDsKLQotCQlFdmVudENoYW5nZVBvbGljeShMaXN0RXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogTWFwIHRoZSBMaXN0Q2hhbmdlRXZlbnQncyBzb3VyY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcGFyZW50LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gVHJlZU1vZGVsQWRhcHRlci50aGlzLnBhcmVudHMuZ2V0KHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdEFkZEV2ZW50IGZvciBhZGRpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgQWRkRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBFdmVudENoYW5nZVBvbGljeSB7Ci0KLQkJQWRkRXZlbnRDaGFuZ2VQb2xpY3koTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIExpc3RBZGRFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiAoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0QWRkRXZlbnQncyBpdGVtIGluZGV4IGlzIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJbmRleCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0QWRkRXZlbnQncyBzaXplIGlzIHRoZSBjaGlsZHJlbiBzaXplLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zU2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0QWRkRXZlbnQncyBpdGVtcyBhcmUgdGhlIGNoaWxkcmVuLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXMoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RSZW1vdmVFdmVudCBmb3IgYWRkaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIFJlbW92ZUV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCVJlbW92ZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0UmVtb3ZlRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlbW92ZUV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlbW92ZUV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlbW92ZUV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0UmVwbGFjZUV2ZW50IGZvciByZXBsYWNpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgUmVwbGFjZUV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCVJlcGxhY2VFdmVudENoYW5nZVBvbGljeShMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIExpc3RSZXBsYWNlRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZXBsYWNlRXZlbnQncyBpdGVtIGluZGV4IGlzIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJbmRleCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0UmVwbGFjZUV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlcGxhY2VFdmVudCdzIGl0ZW1zIGFyZSB0aGUgY2hpbGRyZW4uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXROZXdJdGVtcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgotCQkgKi8KLQkJdm9pZCByZXBsYWNlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gdGhpcy5wYXJlbnQoKS5wYXRoKCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmNoaWxkSW5kaWNlcygpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgdGhpcy5nZXRPbGRDaGlsZHJlbigpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIHRoaXMuY2hpbGRBcnJheSgpKTsKLQkJfQotCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGdldE9sZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRBcnJheSh0aGlzLmdldE9sZEl0ZW1zKCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKSk7Ci0JCX0KLQotCQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0T2xkSXRlbXMoKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXRPbGRJdGVtcygpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdE1vdmVFdmVudCBmb3IgbW92aW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIE1vdmVFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlNb3ZlRXZlbnRDaGFuZ2VQb2xpY3koTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0TW92ZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0TW92ZUV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJdm9pZCBtb3ZlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMubW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRUYXJnZXRJbmRleCgpLCB0aGlzLmdldEV2ZW50KCkuZ2V0U291cmNlSW5kZXgoKSwgdGhpcy5nZXRFdmVudCgpLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RDbGVhckV2ZW50IGZvciBjbGVhcmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBDbGVhckV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUNsZWFyRXZlbnRDaGFuZ2VQb2xpY3koTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDbGVhciBhbGwgdGhlIG5vZGVzLgotCQkgKi8KLQkJdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCA9IHRoaXMucGFyZW50KCk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gcGFyZW50LnBhdGgoKTsKLQkJCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSBUcmVlTW9kZWxBZGFwdGVyLnRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWludFtdIGNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShjaGlsZHJlbkxpc3QsIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0Q2hhbmdlRXZlbnQgZm9yIGNsZWFyaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIENoYW5nZUV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUNoYW5nZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSBhbGwgdGhlIG9sZCBub2RlcyBhbmQgYWRkIGFsbCB0aGUgbmV3IG5vZGVzLgotCQkgKi8KLQkJdm9pZCByZWJ1aWxkQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50ID0gdGhpcy5wYXJlbnQoKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhcmVudFBhdGggPSBwYXJlbnQucGF0aCgpOwotCQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTGlzdCA9IFRyZWVNb2RlbEFkYXB0ZXIudGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQkJaW50W10gY2hpbGRJbmRpY2VzID0gdGhpcy5idWlsZEluZGljZXMoY2hpbGRyZW5MaXN0LnNpemUoKSk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZEFycmF5ID0gdGhpcy5idWlsZEFycmF5KGNoaWxkcmVuTGlzdCwgY2hpbGRyZW5MaXN0LnNpemUoKSk7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMucmVtb3ZlQ2hpbGRyZW4ocGFyZW50UGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZEFycmF5KTsKLQotCQkJY2hpbGRJbmRpY2VzID0gdGhpcy5idWlsZEluZGljZXMocGFyZW50LmNoaWxkcmVuTW9kZWwoKS5zaXplKCkpOwotCQkJY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShwYXJlbnQuY2hpbGRyZW5Nb2RlbCgpLCBwYXJlbnQuY2hpbGRyZW5TaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBUcmVlTm9kZVZhbHVlTW9kZWwgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgaXRzIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIE5vZGVDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlwcml2YXRlIGZpbmFsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlOwotCi0JCU5vZGVDaGFuZ2VQb2xpY3koVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBub2RlIGl0c2VsZiBpcyB0aGUgcGFyZW50LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGRlYWxpbmcgd2l0aCBhbGwgb2YgdGhlIG5vZGUncwotCQkgKiBjaGlsZHJlbiwgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4IGlzIGFsd2F5cyB6ZXJvLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzaXplIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgc2l6ZQotCQkgKiBvZiB0aGUgY2hpbGRyZW4gbW9kZWwuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5vZGUuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBhcmUgYWxsIHRoZSBvYmplY3RzIGhlbGQgYnkKLQkJICogdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU2ZjZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNhbGxiYWNrQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIE5vZGUgY2xhc3Nlcy4KLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgaW5pdGlhbGl6YXRpb24KLSAqICAgICBlbmZvcmNlZCBvYmplY3QgaWRlbnRpdHkgd3J0ICNlcXVhbHMoKS8jaGFzaENvZGUoKQotICogICAgIGNvbnRhaW5tZW50IGhpZXJhcmNoeSAocGFyZW50L2NoaWxkKQotICogICAgIHVzZXIgY29tbWVudAotICogICAgIGRpcnR5IGZsYWcKLSAqICAgICBwcm9ibGVtcwotICogICAgIHNvcnRpbmcKLSAqIAotICogVHlwaWNhbGx5LCBzdWJjbGFzc2VzIHNob3VsZCBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogICAgIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvcnMKLSAqICAgICAgICAgKHdpdGggdGhlIGFwcHJvcHJpYXRlbHktcmVzdHJpY3RpdmUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgcGFyZW50KQotICogICAgICNpbml0aWFsaXplKCkKLSAqICAgICAjaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpCi0gKiAgICAgI2NoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjYWRkQ2hpbGRyZW5UbyhMaXN0IGxpc3QpCi0gKiAgICAgI25vZGVSZW1vdmVkKE5vZGUpCi0gKiAgICAgI3ZhbGlkYXRvcigpCi0gKiAgICAgI3RyYW5zaWVudEFzcGVjdE5hbWVzKCkgb3IKLSAqICAgICAgICAgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0IHRyYW5zaWVudEFzcGVjdE5hbWVzKQotICogICAgICNhZGRQcm9ibGVtc1RvKExpc3QgY3VycmVudFByb2JsZW1zKQotICogICAgICNub25WYWxpZGF0ZWRBc3BlY3ROYW1lcygpCi0gKiAgICAgICAgICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykKLSAqICAgICAjZGlzcGxheVN0cmluZygpCi0gKiAgICAgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBOb2RlCi17Ci0KLQkvKiogQ29udGFpbm1lbnQgaGllcmFyY2h5LiAqLwotCXByaXZhdGUgTm9kZSBwYXJlbnQ7ICAvLyBwc2V1ZG8tZmluYWwKLQotCS8qKiBUcmFjayB3aGV0aGVyIHRoZSBub2RlIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGlydHlCcmFuY2g7Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSdzIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHJpdmF0ZSBWZWN0b3I8UHJvYmxlbT4gcHJvYmxlbXM7CQkvLyBwc2V1ZG8tZmluYWwKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfUFJPQkxFTV9NRVNTQUdFX0FSR1VNRU5UUyA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVGhpcyBtdXN0IGJlIHJlY2FsY3VsYXRlZCBldmVyeSB0aW1lIHRoaXMgbm9kZSBvciBvbmUgb2YgaXRzCi0JICogZGVzY2VuZGFudHMgY2hhbmdlcyBpdCBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCi0JLyoqIFVzZXIgY29tbWVudC4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBjb21tZW50OwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0cyBvZiB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gdHJhbnNpZW50QXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0JLyoqCi0JICogU2V0cyBvZiBub24tdmFsaWRhdGVkIGFzcGVjdCBuYW1lcywga2V5ZWQgYnkgY2xhc3MuCi0JICogVGhpcyBpcyBidWlsdCB1cCBsYXppbHksIGFzIHRoZSBvYmplY3RzIGFyZSBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogTW9zdCBvYmplY3RzIG11c3QgaGF2ZSBhIHBhcmVudC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgbm9kZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZShOb2RlIHBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmNvbW1lbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGEgbmV3IG9iamVjdCBpcyBkaXJ0eSwgYnkgZGVmaW5pdGlvbgotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5kaXJ0eUJyYW5jaCA9IHRydWU7Ci0KLQkJdGhpcy5wcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UuCi0JICogQHNlZSAjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnROb2RlKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKHBhcmVudE5vZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0NoYW5nZVN1cHBvcnQodGhpcywgdGhpcy5idWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyIGJ1aWxkQ2hhbmdlU3VwcG9ydExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCQlBYnN0cmFjdE5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogT3ZlcnJpZGUgI2FkZENoaWxkcmVuVG8oTGlzdCkuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAc2VlICNhZGRDaGlsZHJlblRvKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYXRvcjxOb2RlPiBjaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJdGhpcy5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIGNoaWxkcmVuCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKiBOQjogUm9vdCBub2RlIG1vZGVsIGltcGxlbWVudGF0aW9ucyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyByb290IG5vZGUgc2hvdWxkIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT25seSByb290IG5vZGVzIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZSwgTm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgT2JqZWN0Li4uIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSh0aGlzLCBtZXNzYWdlS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXkpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcm9ibGVtKG1lc3NhZ2VLZXksIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkvLyBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCQkvLyBXaGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlYnVpbGQgdGhlICJicmFuY2giIHByb2JsZW1zIGFuZCByZXR1cm4gd2hldGhlciB0aGV5IGhhdmUKLQkgKiBjaGFuZ2VkLgotCSAqIE5COiBUaGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgbXVzdCBiZSByZS1jYWxjdWxhdGVkCi0JICogd2l0aCBFVkVSWSAic2lnbmlmaWNhbnQiIGNoYW5nZSAtIHdlIGNhbm5vdCBrZWVwIGl0IGluIHN5bmNoIHZpYQotCSAqIGNoYW5nZSBub3RpZmljYXRpb25zIGJlY2F1c2UgaWYgYSBkZXNjZW5kYW50IHdpdGggcHJvYmxlbXMgaXMKLQkgKiByZW1vdmVkIG9yIHJlcGxhY2VkIHdlIHdpbGwgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgaXRzCi0JICogcHJvYmxlbXMgd2VyZSByZW1vdmVkIGZyb20gb3VyICJicmFuY2giIHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja0JyYW5jaFByb2JsZW1zKCkgewotCQlWZWN0b3I8UHJvYmxlbT4gb2xkQnJhbmNoUHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQlpbnQgb2xkU2l6ZSA9IHRoaXMuYnJhbmNoUHJvYmxlbXMuc2l6ZSgpOwotCi0JCXRoaXMuYnJhbmNoUHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5hZGRBbGwodGhpcy5wcm9ibGVtcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRCcmFuY2hQcm9ibGVtc1RvKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQl9Ci0KLQkJLy8gaWYgdGhlIHNpemUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB6ZXJvLCBvdXIgdmlydHVhbCBmbGFnIGhhcyBjaGFuZ2VkCi0JCWludCBuZXdTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JCWlmICgob2xkU2l6ZSA9PSAwKSAmJiAobmV3U2l6ZSAhPSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIGZhbHNlLCB0cnVlKTsKLQkJfSBlbHNlIGlmICgob2xkU2l6ZSAhPSAwKSAmJiAobmV3U2l6ZSA9PSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIHRydWUsIGZhbHNlKTsKLQkJfQotCi0JCWlmIChvbGRCcmFuY2hQcm9ibGVtcy5lcXVhbHModGhpcy5icmFuY2hQcm9ibGVtcykpIHsKLQkJCXJldHVybiBmYWxzZTsJCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBkaWQgbm90IGNoYW5nZQotCQl9Ci0JCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBjaGFuZ2VkCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgYWxsIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSBhbmQgYWxsCi0JICogdGhlIHByb2JsZW1zIG9mIGl0cyBkZXNjZW5kYW50cyB0byB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gbGlzdCkgewotCQlsaXN0LmFkZEFsbCh0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQ7Ci0JICogdGhlcmVmb3JlIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgaGF2ZSBjaGFuZ2VkIGFsc28gYW5kCi0JICogbXVzdCBiZSByZWJ1aWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlYnVpbGRCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKCAhIHRoaXMuY2hlY2tCcmFuY2hQcm9ibGVtcygpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBzaG91bGQgbm90IGdldCBoZXJlIHVubGVzcyBvdXIgXCJicmFuY2hcIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKHRoaXMuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkpIHsKLQkJCS8vIGlmIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQsIHRoZW4KLQkJCS8vIG91ciBwYXJlbnQgbXVzdCByZWJ1aWxkIGl0cyAiYnJhbmNoIiBwcm9ibGVtcyBhbHNvCi0JCQl0aGlzLnJlYnVpbGRQYXJlbnRCcmFuY2hQcm9ibGVtcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkgewotCQlpZiAodGhpcy5icmFuY2hQcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2xlYXIgb3VyICJicmFuY2giCi0JCQkvLyBwcm9ibGVtcyBubyBtYXR0ZXIgd2hhdAotCQkJY2hpbGQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0JCX0KLQkJdGhpcy5wcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZLCB0cnVlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBjaGFuZ2UgdG8gc3BlY2lmaWVkIGFzcGVjdCByZXF1aXJlcyBhIHJlLXZhbGlkYXRpb24KLQkgKiBvZiB0aGUgbm9kZSdzIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdENoYW5nZVJlcXVpcmVzVmFsaWRhdGlvbihTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdENoYW5nZURvZXNOb3RSZXF1aXJlVmFsaWRhdGlvbihhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAibm9uLXZhbGlkYXRlZCIgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHZhbGlkYXRlZCwgaS5lLiBjaGVja2VkIGZvciBwcm9ibGVtcy4KLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJub24tdmFsaWRhdGVkIiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBzZXQuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykgewotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQ09NTUVOVF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChESVJUWV9CUkFOQ0hfUFJPUEVSVFkpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSk7Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwbGF5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZGV2ZWxvcGVyLWZyaWVuZGx5IFN0cmluZy4gSWYgeW91IHdhbnQgc29tZXRoaW5nIHVzZWZ1bCBmb3IKLQkgKiBkaXNwbGF5aW5nIGluIGEgdXNlciBpbnRlcmZhY2UsIHVzZSAjZGlzcGxheVN0cmluZygpLgotCSAqIElmIHlvdSB3YW50IHRvIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiBpbiB5b3VyICN0b1N0cmluZygpLAotCSAqIG92ZXJyaWRlICN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKS4gCi0JICogV2hhdGV2ZXIgeW91IGFkZCB0byB0aGF0IHN0cmluZyBidWZmZXIgd2lsbCBzaG93IHVwIGJldHdlZW4gdGhlIHBhcmVudGhlc2VzLgotCSAqIEBzZWUgQWJzdHJhY3RNb2RlbCN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKQotCSAqIEBzZWUgI2Rpc3BsYXlTdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvQXN5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyMDU5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogc2ltcGx5IHNldHMgYSBzaGFyZWQgInZhbGlkYXRlIiBmbGFnIHRvIHRydWUuIFRoaXMgc2hvdWxkIHRyaWdnZXIgYQotICogc2VwYXJhdGUgInZhbGlkYXRpb24iIHRocmVhZCB0byBiZWdpbiB2YWxpZGF0aW5nIHRoZSBhcHByb3ByaWF0ZQotICogYnJhbmNoIG9mIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhlIHNwZWNpZmllZCBzaGFyZWQKLQkgKiAidmFsaWRhdGUiIGZsYWcuIFRoaXMgZmxhZyBzaG91bGQgYmUgc2hhcmVkIHdpdGgKLQkgKiBhbm90aGVyIHRocmVhZCB0aGF0IHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1ZhbGlkYXRvcihTeW5jaHJvbml6ZWRCb29sZWFuIHZhbGlkYXRlRmxhZykgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbGlkYXRlRmxhZyA9IHZhbGlkYXRlRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZSwgdHJpZ2dlcmluZwotCSAqIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZQotCSAqIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy52YWxpZGF0ZUZsYWcuc2V0VHJ1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsaWRhdGVGbGFnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9EZWZhdWx0UHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM4OThjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFByb2JsZW0gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2JsZW0KLQlpbXBsZW1lbnRzIFByb2JsZW0KLXsKLQlwcml2YXRlIGZpbmFsIE5vZGUgc291cmNlOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VLZXk7Ci0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzOwotCi0KLQlEZWZhdWx0UHJvYmxlbShOb2RlIHNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMubWVzc2FnZUtleSA9IG1lc3NhZ2VLZXk7Ci0JCXRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2JsZW0gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE5vZGUgc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBtZXNzYWdlS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlS2V5OwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGltcGxlbWVudCAjZXF1YWxzKE9iamVjdCkgYmVjYXVzZSBwcm9ibGVtcyBhcmUgcmVwZWF0ZWRseQotCSAqIHJlLWNhbGN1bGF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgcHJvYmxlbXMgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nCi0JICogc2V0IG9mIHByb2JsZW1zOyBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBwcm9ibGVtcyBhbmQKLQkgKiBpZ25vcmUgYW55IGZyZXNobHktZ2VuZXJhdGVkIGR1cGxpY2F0ZXMuCi0JICogQWxzbywgcHJvYmxlbXMgYXJlIG5vdCBzYXZlZCB0byBkaXNrLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBQcm9ibGVtKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVByb2JsZW0gb3RoZXIgPSAoUHJvYmxlbSkgbzsKLQkJcmV0dXJuIHRoaXMuc291cmNlID09IG90aGVyLnNvdXJjZSgpCi0JCQkJJiYgdGhpcy5tZXNzYWdlS2V5LmVxdWFscyhvdGhlci5tZXNzYWdlS2V5KCkpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLm1lc3NhZ2VBcmd1bWVudHMsIG90aGVyLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlLmhhc2hDb2RlKCkgXiB0aGlzLm1lc3NhZ2VLZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm1lc3NhZ2VLZXkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvTm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkNzU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgaXRzIHBhcmVudCBhcyBkaXJ0eSBicmFuY2hlcy4KLQkgKiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBkaXJ0eS4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBkaXJ0eS4KLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgc2F2ZSBsb2NhdGlvbiBvZiBzb21lCi0JICogdG9wLWxldmVsIG5vZGUgaXMgY2hhbmdlZCBhbmQgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUgbXVzdCBiZSBtYXJrZWQgZGlydHkgc28gaXQKLQkgKiB3aWxsIGJlIHdyaXR0ZW4gb3V0LgotCSAqLwotCXZvaWQgbWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzIGJyYW5jaCBoYXMgYmVlbiBtYXJrZWQgY2xlYW4uIElmIHRoZSBub2RlCi0JICogaXRzZWxmIGlzIGNsZWFuIGFuZCBpZiBhbGwgb2YgaXRzIGNoaWxkcmVuIGFyZSBhbHNvIGNsZWFuLCB0aGUKLQkgKiBub2RlJ3MgYnJhbmNoIGNhbiBiZSBtYXJrZWQgY2xlYW4uIFRoZW4sIGlmIHRoZSBub2RlJ3MKLQkgKiBicmFuY2ggaXMgY2xlYW4sIHRoZSBub2RlIHdpbGwgbm90aWZ5IGl0cyBwYXJlbnQgdGhhdCBpdCBtaWdodAotCSAqIGJlIGNsZWFuIGFsc28uIFRoaXMgbWVzc2FnZSBpcyBwcm9wYWdhdGVkIHVwIHRoZSBjb250YWlubWVudAotCSAqIHRyZWUgd2hlbiBhIHBhcnRpY3VsYXIgbm9kZSBiZWNvbWVzIGNsZWFuLgotCSAqLwotCXZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBNYXJrIHRoZSBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGNsZWFuLgotCSAqIFR5cGljYWxseSB1c2VkIHdoZW4gdGhlIG5vZGUgaGFzIGp1c3QgYmVlbgotCSAqIHJlYWQgaW4gb3Igd3JpdHRlbiBvdXQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKiBOb3QgdGhlIGJlc3Qgb2YgbWV0aG9kIG5hbWVzLi4uLiA6LSgKLQkgKi8KLQl2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9ibGVtcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFJldHVybiBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIFNldCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpOwotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgaW52b2tlZCBieSBhIGNsaWVudDsgYW5kIGl0IHdpbGwKLQkgKiB0eXBpY2FsbHkgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0JICogCSNicmFuY2hQcm9ibGVtcygpCi0JICogCSNoYXNCcmFuY2hQcm9ibGVtcygpCi0JICogV2hldGhlciB0aGUgbm9kZSBtYWludGFpbnMgaXRzIHByb2JsZW1zIG9uIHRoZSBmbHkKLQkgKiBvciB3YWl0cyB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIFByb2JsZW0KLQkgKi8KLQl2b2lkIHZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBCUkFOQ0hfUFJPQkxFTVNfTElTVCA9ICJicmFuY2hQcm9ibGVtcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCWludCBicmFuY2hQcm9ibGVtc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMgaGF2ZSBwcm9ibGVtcy4KLQkgKi8KLQlib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZID0gImhhc0JyYW5jaFByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCk7Ci0KLQotCS8vICoqKioqKioqKiogZGlzcGxheWluZy9zb3J0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwsIHN1aXRhYmxlIGZvciBzb3J0aW5nLgotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2ltcGxlIGludGVyZmFjZSBkZWZpbmluZyBhICJyZWZlcmVuY2UiIGJldHdlZW4gdHdvIG5vZGVzLgotCSAqIEBzZWUgTm9kZSNhZGRCcmFuY2hSZWZlcmVuY2VzVG8oamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JaW50ZXJmYWNlIFJlZmVyZW5jZSB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInNvdXJjZSIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogcmVmZXJlbmNlcyB0aGUgInRhcmdldCIgbm9kZS4KLQkJICovCi0JCU5vZGUgc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInRhcmdldCIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogaXMgcmVmZXJlbmNlZCBieSB0aGUgInNvdXJjZSIgbm9kZS4KLQkJICovCi0JCU5vZGUgdGFyZ2V0KCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEEgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgYSBub2RlIGFzIGFwcHJvcHJpYXRlLgotCSAqIFR5cGljYWxseSB0aGUgdmFsaWRhdGlvbiB3aWxsCi0JICogCS0gb2NjdXIgd2hlbmV2ZXIgYSBub2RlIGhhcyBjaGFuZ2VkCi0JICogCS0gZW5jb21wYXNzIHRoZSBlbnRpcmUgdHJlZSBjb250YWluaW5nIHRoZSBub2RlCi0JICogCS0gZXhlY3V0ZSBhc3luY2hyb25vdXNseQotCSAqLwotCWludGVyZmFjZSBWYWxpZGF0b3IgewotCi0JCS8qKgotCQkgKiBBICJzaWduaWZpY2FudCIgYXNwZWN0IGhhcyBjaGFuZ2VkOwotCQkgKiB2YWxpZGF0ZSB0aGUgbm9kZSBhcyBhcHByb3ByaWF0ZQotCQkgKi8KLQkJdm9pZCB2YWxpZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBTdG9wIGFsbCB2YWxpZGF0aW9uIG9mIHRoZSBub2RlIHVudGlsICNyZXN1bWUoKSBpcyBjYWxsZWQuCi0JCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW55IGxvbmctcnVubmluZwotCQkgKiBhY3Rpb24gdGhhdCB0cmlnZ2VycyBudW1lcm91cyBjaGFuZ2VzIHRvIHRoZSBub2RlLiBCZSBzdXJlIHRvCi0JCSAqIG1hdGNoIGEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aXRoIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvCi0JCSAqICNyZXN1bWUoKS4KLQkJICovCi0JCXZvaWQgcGF1c2UoKTsKLQotCQkvKioKLQkJICogUmVzdW1lIHZhbGlkYXRpb24gb2YgdGhlIG5vZGUuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlCi0JCSAqIGNhbGxlZCBhZnRlciBhIG1hdGNoaW5nIGNhbGwgdG8gI3BhdXNlKCkuCi0JCSAqLwotCQl2b2lkIHJlc3VtZSgpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWZlcmVuY2UgaW50ZXJmYWNlCi0JICogZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2ltcGxlUmVmZXJlbmNlIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBOb2RlIHNvdXJjZTsKLQkJcHJpdmF0ZSBOb2RlIHRhcmdldDsKLQkJcHVibGljIFNpbXBsZVJlZmVyZW5jZShOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoc291cmNlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCX0KLQkJcHVibGljIE5vZGUgc291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMuc291cmNlOwotCQl9Ci0JCXB1YmxpYyBOb2RlIHRhcmdldCgpIHsKLQkJCXJldHVybiB0aGlzLnRhcmdldDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc291cmNlICsgIiA9PiAiICsgdGhpcy50YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdG9yIGRvZXMgbm90aGluZyB0byB2YWxpZGF0ZSB0aGUgbm9kZS4KLQkgKi8KLQlWYWxpZGF0b3IgTlVMTF9WQUxJREFUT1IgPQotCQluZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZS5OdWxsLmluc3RhbmNlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk5vZGUuTlVMTF9WQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1BsdWdnYWJsZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NGY4YWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWYWxpZGF0b3IgaW50ZXJmYWNlIGltcGxlbWVudHMgdGhlCi0gKiBwYXVzZS9yZXN1bWUgcG9ydGlvbiBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkZWxlZ2F0ZXMgdGhlIGFjdHVhbAotICogdmFsaWRhdGlvbiB0byBhICJwbHVnZ2FibGUiIGRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2dhYmxlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBOb2RlLlZhbGlkYXRvcgotewotCXByaXZhdGUgYm9vbGVhbiBwYXVzZTsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPblJlc3VtZTsKLQlwcml2YXRlIGZpbmFsIERlbGVnYXRlIGRlbGVnYXRlOwotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBBc3luY2hyb25vdXNWYWxpZGF0b3IodmFsaWRhdGVGbGFnKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlLlZhbGlkYXRvciBidWlsZFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihuZXcgU3luY2hyb25vdXNWYWxpZGF0b3Iobm9kZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsZWdhdGUuCi0JICovCi0JcHVibGljIFBsdWdnYWJsZVZhbGlkYXRvcihEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdXNlID0gZmFsc2U7Ci0JCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZGVsZWdhdGUudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXVzZSgpIHsKLQkJaWYgKHRoaXMucGF1c2UpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFscmVhZHkgcGF1c2VkIik7Ci0JCX0KLQkJdGhpcy5wYXVzZSA9IHRydWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc3VtZSgpIHsKLQkJaWYgKCAhIHRoaXMucGF1c2UpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBwYXVzZWQiKTsKLQkJfQotCQl0aGlzLnBhdXNlID0gZmFsc2U7Ci0JCS8vIHZhbGlkYXRlIGFueSBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHZhbGlkYXRpb24gd2FzIHBhdXNlZAotCQlpZiAodGhpcy52YWxpZGF0ZU9uUmVzdW1lKSB7Ci0JCQl0aGlzLnZhbGlkYXRlT25SZXN1bWUgPSBmYWxzZTsKLQkJCXRoaXMuZGVsZWdhdGUudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVsZWdhdGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbnkgZGVsZWdhdGVzIG9mIGEgcGx1Z2dhYmxlIHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIERlbGVnYXRlIHsKLQotCQkvKioKLQkJICogVGhlIHZhbGlkYXRvciBpcyBub3QgInBhdXNlZCIgLSBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSB2YWxpZGF0aW9uLgotCQkgKi8KLQkJdm9pZCB2YWxpZGF0ZSgpOwotCi0KLQkJLyoqCi0JCSAqIFRoaXMgZGVsZWdhdGUgZG9lcyBub3RoaW5nLgotCQkgKi8KLQkJZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIERlbGVnYXRlIHsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVsZWdhdGUgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJcHVibGljIHN0YXRpYyBEZWxlZ2F0ZSBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZS5OdWxsIjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOGU3MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi0vKioKLSAqIERlZmluZSBhbiBpbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIGEgbm9kZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9ibGVtIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSBtb3N0IGNsb3NlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9ibGVtLgotCSAqLwotCU5vZGUgc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBrZXkgdGhhdCBjYW4gYmUgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgcHJvYmxlbSdzIG1lc3NhZ2UuCi0JICovCi0JU3RyaW5nIG1lc3NhZ2VLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJndW1lbnRzIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9ibGVtJ3MgbWVzc2FnZS4KLQkgKi8KLQlPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvYmxlbSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBJdCBpcyBlcXVhbCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIFByb2JsZW0gaW50ZXJmYWNlIGFuZCBpdHMgc291cmNlLCBtZXNzYWdlIGtleSwgYW5kIG1lc3NhZ2UKLQkgKiBhcmd1bWVudHMgYXJlIGFsbCBlcXVhbCB0byB0aGlzIHByb2JsZW0ncy4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2JsZW0ncyBoYXNoIGNvZGUsIHdoaWNoIHNob3VsZCBjYWxjdWxhdGVkIGFzIGFuCi0JICogWE9SIG9mIHRoZSBzb3VyY2UncyBoYXNoIGNvZGUgYW5kIHRoZSBtZXNzYWdlIGtleSdzIGhhc2ggY29kZS4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1N5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTZiOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZSBpbnRlcmZhY2UKLSAqIHdpbGwgdmFsaWRhdGUgdGhlIG5vZGUgaW1tZWRpYXRlbHkuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgaW4gYSBzaW5nbGUgdGhyZWFkIG9yIGdlbmVyYXRpbmcKLSAqIHByb2JsZW0gcmVwb3J0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIGZpbmFsIE5vZGUgbm9kZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgaW1tZWRpYXRlbHkgdmFsaWRhdGUgdGhlCi0JICogc3BlY2lmaWVkIG5vZGUuCi0JICovCi0JcHVibGljIFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLm5vZGUudmFsaWRhdGVCcmFuY2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NhY2hpbmdDb21ib0JveE1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViZTI2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBhIGNsaWVudCB0byBiZXR0ZXIgY29udHJvbCB0aGUgcGVyZm9ybWFuY2Ugb2YKLSAqIGEgY29tYm8gYm94IG1vZGVsIGJ5IGFsbG93aW5nIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB3aGVuIGl0IGlzCi0gKiBhY2NlcHRhYmxlIGZvciB0aGUgbW9kZWwgdG8gImNhY2hlIiBhbmQgInVuY2FjaGUiIGl0cyBsaXN0IG9mIGVsZW1lbnRzLgotICogVGhlIG1vZGVsIG1heSBpZ25vcmUgdGhlc2UgaGludHMgaWYgYXBwcm9wcmlhdGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGluZ0NvbWJvQm94TW9kZWwgZXh0ZW5kcyBDb21ib0JveE1vZGVsIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWNoZSB0aGUgY29tYm9Cb3hNb2RlbCBMaXN0LiAgSWYgeW91IGNhbGwgdGhpcywgeW91Ci0gICAgICogbXVzdCBtYWtlIHN1cmUgdG8gY2FsbCB1bmNhY2hlTGlzdCgpIGFzIHdlbGwuICBPdGhlcndpc2UKLSAgICAgKiBzdGFsZSBkYXRhIHdpbGwgYmUgaW4gdGhlIENvbWJvQm94IHVudGlsIGNhY2hlTGlzdCgpIGlzIAotICAgICAqIGNhbGxlZCBhZ2FpbiBvciB1bmNhY2hlTGlzdCgpIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICB2b2lkIGNhY2hlTGlzdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBjYWNoZWQgbGlzdC4gIE5leHQgdGltZSB0aGUgbGlzdCBpcyBuZWVkZWQgaXQgd2lsbAotICAgICAqIGJlIGJ1aWx0IHdoZW4gaXQgaXMgbm90IGNhY2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVuY2FjaGVMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGxpc3QgaXMgYWxyZWFkeSBjYWNoZWQuICBUaGlzIGNhbiBiZSB1c2VkIGZvciAKLSAgICAgKiBNb3VzZUV2ZW50cywgc2luY2UgdGhleSBhcmUgbm90IHRlcnJpYmx5IHByZWRpY3RhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNDYWNoZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZWM2YmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY2hlY2sgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByaXZhdGUgZmluYWwgSkNoZWNrQm94IGNoZWNrQm94OwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCBubyBsYWJlbCBvciBpY29uLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KCk7Ci0JCS8vIGJ5IGRlZmF1bHQsIGNoZWNrIGJveGVzIGRvIG5vdCBwYWludCB0aGVpciBib3JkZXJzCi0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyUGFpbnRlZCh0cnVlKTsKLQkJLy8gdGhpcyBzZXR0aW5nIGlzIHJlY29tbWVuZGVkIGZvciBjaGVjayBib3hlcyBpbnNpZGUgb2YgdHJlZXMgYW5kIHRhYmxlcwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWRGbGF0KHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGljb24sCi0JICogZWl0aGVyIG9mIHdoaWNoIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0LCBJY29uIGljb24pIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXModGV4dCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihJY29uIGljb24pIHsKLQkJdGhpcyhudWxsLCBpY29uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGJ1aWxkQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjYiA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2IuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2I7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkgICAgdGhpcy5jaGVja0JveC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCXRoaXMuY2hlY2tCb3guc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5jaGVja0JveC5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQkvLyBvbmNlIHRoZSBjb2xvcnMgYXJlIHNldCwgY2FsY3VsYXRlIG9wYXF1ZSBzZXR0aW5nCi0JCXRoaXMuY2hlY2tCb3guc2V0T3BhcXVlKHRoaXMuY2VsbElzT3BhcXVlSW4odGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsRm9yZWdyb3VuZCIpOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxCYWNrZ3JvdW5kIik7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/ICBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKSA6IE5PX0ZPQ1VTX0JPUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY2VsbCBzaG91bGQgYmUgb3BhcXVlIGluIHRoZSB0YWJsZS4KLQkgKiBJZiB0aGUgY2VsbCdzIGJhY2tncm91bmQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhYmxlJ3MgYmFja2dyb3VuZAotCSAqIGFuZCB0YWJsZSBpcyBvcGFxdWUsIHdlIGRvbid0IG5lZWQgdG8gcGFpbnQgdGhlIGJhY2tncm91bmQgLQotCSAqIHRoZSB0YWJsZSB3aWxsIGRvIGl0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNlbGxJc09wYXF1ZUluKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCUNvbG9yIGNlbGxCYWNrZ3JvdW5kID0gdGhpcy5jaGVja0JveC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIHRhYmxlQmFja2dyb3VuZCA9IHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuICEgKHRhYmxlLmlzT3BhcXVlKCkgJiYgY2VsbEJhY2tncm91bmQuZXF1YWxzKHRhYmxlQmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQl0aGlzLmNoZWNrQm94LnNldFNlbGVjdGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHRleHQ7IHdoaWNoIGJ5IGRlZmF1bHQgaXMgYmxhbmsuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyBpY29uOyB3aGljaCBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpY29uKSB7Ci0JCXRoaXMuY2hlY2tCb3guc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSB0YWJsZSdzIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjaGVjayBib3gKLQkgKiB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLmNoZWNrQm94LmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOGQxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiBNYWtlIHRoZSBjZWxsIGxvb2sgbGlrZSBhIGNvbWJvLWJveC4KLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50cyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLlJlbmRlcmVyIHsKLQotCS8qIGNhY2hpbmcgdGhlIGNvbWJvIGJveCBiZWNhdXNlIHdlIGFyZSBjYWNoaW5nIHRoZSBjb21ib0JveE1vZGVsLgotCSAqIEV2ZXJ5dGltZSB3ZSByZWJ1aWx0IHRoZSBjb21ib0JveCB3ZSB3b3VsZCBzZXQgdGhlIG1vZGVsIG9uIGl0IGFuZCBub3QKLQkgKiByZW1vdmUgdGhlIG1vZGVsIGZyb20gdGhlIG9sZCBjb21ibyBib3guICBUaGlzIG1lYW50IHRoYXQgbmV3IGxpc3RlbmVycwotCSAqIGtlcHQgYmVpbmcgYWRkZWQgdG8gdGhlIGNvbWJvQm94TW9kZWwgZm9yIGV2ZXJ5IGNvbWJvQm94IGJ1aWxkLgotCSAqIE5vdCBzdXJlIGlmIHRoZXJlIGlzIGEgd2F5IHRvIGNsZWFyIG91dCB0aGUgb2xkIGNvbWJvIGJveCwgb3Igd2h5Ci0JICogd2Ugd2VyZSBidWlsZGlnIGEgbmV3IGNvbWJvIGJveCBldmVyeSB0aW1lIHNvIEkgd2VudCB3aXRoIGNhY2hpbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggY29tYm9Cb3g7Ci0JCi0JLyoqIHRoZSBpdGVtcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBjb21ibyBib3ggKi8KLQlwcml2YXRlIENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsOwotCXByaXZhdGUgTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcjsKLQlPYmplY3QgdmFsdWU7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGhlaWdodCA9IC0xOwotCWJvb2xlYW4gZmFrZUZvY3VzRmxhZzsKLQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCQotCS8qKiBob2xkIHRoZSBvcmlnaW5hbCBjb2xvcnMgb2YgdGhlIGNvbWJvLWJveCAqLwotCXByaXZhdGUgc3RhdGljIENvbG9yIGRlZmF1bHRGb3JlZ3JvdW5kOwotCXByaXZhdGUgc3RhdGljIENvbG9yIGRlZmF1bHRCYWNrZ3JvdW5kOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21iby1ib3ggbW9kZWwuCi0JICovCi0JcHVibGljIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKG5ldyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbChtb2RlbCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGNhY2hpbmcgY29tYm8tYm94IG1vZGVsLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21iby1ib3ggbW9kZWwgYW5kIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENvbWJvQm94TW9kZWwgbW9kZWwsIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpLCByZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjYWNoaW5nIGNvbWJvLWJveCBtb2RlbCBhbmQgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwsIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJdGhpcyhtb2RlbCk7Ci0JCXRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBzYXZlIHRoZSBvcmlnaW5hbCBjb2xvcnMgb2YgdGhlIGNvbWJvLWJveCwgc28gd2UKLQkJLy8gY2FuIHVzZSB0aGVtIHRvIHBhaW50IG5vbi1zZWxlY3RlZCBjZWxscwotCQlpZiAoaGVpZ2h0ID09IC0xKSB7Ci0JCQlKQ29tYm9Cb3ggY2IgPSBuZXcgSkNvbWJvQm94KCk7Ci0JCQljYi5hZGRJdGVtKCJtIik7Ci0KLQkJCS8vIGFkZCBpbiBzcGFjZSBmb3IgdGhlIGJvcmRlciB0b3AgYW5kIGJvdHRvbQotCQkJaGVpZ2h0ID0gY2IuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCArIDI7Ci0KLQkJCWRlZmF1bHRGb3JlZ3JvdW5kID0gY2IuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJZGVmYXVsdEJhY2tncm91bmQgPSBjYi5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQl9Ci0KLSAgICBzdGF0aWMgSkxhYmVsIHByb3RvdHlwZUxhYmVsID0gbmV3IEpMYWJlbCgiUHJvdG90eXBlIiwgbmV3IEVtcHR5SWNvbigxNiksIFN3aW5nQ29uc3RhbnRzLkxFQURJTkcpOwotCi0gICAgcHJvdGVjdGVkIEpDb21ib0JveCBidWlsZENvbWJvQm94KCkgewotCi0JCWZpbmFsIEpDb21ib0JveCByZXN1bHQgPSBuZXcgSkNvbWJvQm94KCkgewotCQkJcHJpdmF0ZSBib29sZWFuIGZha2VGb2N1czsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCQkJcmV0dXJuIGZha2VGb2N1cyB8fCBzdXBlci5oYXNGb2N1cygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7Ci0JCQkJZmFrZUZvY3VzID0gQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLmZha2VGb2N1c0ZsYWc7Ci0JCQkJc3VwZXIucGFpbnQoZyk7Ci0JCQkJZmFrZUZvY3VzID0gZmFsc2U7Ci0JCQl9Ci0JCQkvL3dyYXAgdGhlIHJlbmRlcmVyIHRvIGRlYWwgd2l0aCB0aGUgcHJvdG90eXBlRGlzcGxheVZhbHVlCi0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCSAgICAgICAgc3VwZXIuc2V0UmVuZGVyZXIobmV3IExpc3RDZWxsUmVuZGVyZXIoKXsKLQkJICAgICAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2LCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJICAgICAgICAgICAgICAgIGlmICh2ID09IHByb3RvdHlwZUxhYmVsKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgcmV0dXJuIGFSZW5kZXJlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHYsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfSk7Ci0JCSAgICB9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLQkJICAgICAgICBib29sZWFuIGxpc3ROb3RDYWNoZWQgPSAhbGlzdElzQ2FjaGVkKCk7Ci0JCSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLQkJICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIAotCQkJCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkgICAgICAgIGlmIChsaXN0Tm90Q2FjaGVkKSB7Ci0JCSAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JCSAgICAgICAgfQotCQkJCXJldHVybiBpbmRleDsKLQkJICAgfQotCi0JCX07Ci0JCS8vIHN0b2xlIHRoaXMgY29kZSBmcm9tIGphdmF4LnN3aW5nLkRlZmF1bHRDZWxsRWRpdG9yCi0JCXJlc3VsdC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbWJvQm94LmlzVGFibGVDZWxsRWRpdG9yIiwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRBY3Rpb25MaXN0ZW5lcigpKTsKLQkJcmVzdWx0LmFkZFBvcHVwTWVudUxpc3RlbmVyKHRoaXMuYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpKTsKLQkJCi0gICAgICAgIC8vVGhlc2UgYXJlIHVzZWQgdG8gd29ya2Fyb3VuZCBwcm9ibGVtcyB3aXRoIFN3aW5nIHRyeWluZyB0byAKLSAgICAgICAgLy9kZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBjb21ib0JveCB3aXRoIGEgbGFyZ2UgbW9kZWwKLSAgICAgICAgcmVzdWx0LnNldFByb3RvdHlwZURpc3BsYXlWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIGdldExpc3RCb3gocmVzdWx0KS5zZXRQcm90b3R5cGVDZWxsVmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICAKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0gICAgCi0gICAgcHJpdmF0ZSBKTGlzdCBnZXRMaXN0Qm94KEpDb21ib0JveCByZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIChKTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHJlc3VsdC5nZXRVSSgpLCAibGlzdEJveCIpOwotICAgIH0KLQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJSkNvbWJvQm94IGNiID0gKEpDb21ib0JveCkgZS5nZXRTb3VyY2UoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gY2IuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbSBhbmQgaW52b2tlIGltbWVkaWF0ZUVkaXQoKSBpZiB0aGUKLQkJCQkvLyBzZWxlY3RlZCBpdGVtIGFjdHVhbGx5IGNoYW5nZWQsIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JCQkJLy8gZWRpdGluZywgdGhlIG1vZGVsIGNoYW5nZXMgYW5kIGNhdXNlcyB0aGlzIG1ldGhvZCB0byBiZSBpbnZva2VkLAotCQkJCS8vIGl0IGNhdXNlcyBDUiMzOTYzNjc1IHRvIG9jY3VyIGJlY2F1c2UgaW1tZWRpYXRlRWRpdCgpIHN0b3AgdGhlCi0JCQkJLy8gZWRpdGluZywgd2hpY2ggaXMgZG9uZSBhdCB0aGUgd3JvbmcgdGltZQotCQkJCWlmIChDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMudmFsdWUgIT0gc2VsZWN0ZWRJdGVtKSB7Ci0JCQkJCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy52YWx1ZSA9IGNiLmdldFNlbGVjdGVkSXRlbSgpOwotCQkJCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGltbWVkaWF0ZUVkaXQoKSB7Ci0JCWlmICh0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lci5pbW1lZGlhdGVFZGl0KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQb3B1cE1lbnVMaXN0ZW5lciBidWlsZFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkJCQkJdW5jYWNoZUxpc3QoKTsKLQkJCQl9Ci0JCQkJY2FjaGVMaXN0KCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZUludmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JICAgICAgICAgICAgaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JICAgICAgICAgICAgfQotCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51Q2FuY2VsZWQoUG9wdXBNZW51RXZlbnQgZSkgewotCSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotCSAgICAgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCSAgICAgICAgICAgIH0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQl2b2lkIGNhY2hlTGlzdCgpIHsKLQkJdGhpcy5tb2RlbC5jYWNoZUxpc3QoKTsKLQl9Ci0JCi0Jdm9pZCB1bmNhY2hlTGlzdCgpIHsKLQkJdGhpcy5tb2RlbC51bmNhY2hlTGlzdCgpOwotCX0JCi0JCi0JYm9vbGVhbiBsaXN0SXNDYWNoZWQoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsLmlzQ2FjaGVkKCk7Ci0JfQotCS8vICoqKioqKioqKiogVGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgdGFibGUsIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5mYWtlRm9jdXNGbGFnID0gc2VsZWN0ZWQgfHwgaGFzRm9jdXM7Ci0JCWlmICh0aGlzLmNvbWJvQm94ID09IG51bGwpIHsKLQkJCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3goKTsKLQkKLQkJCXRoaXMuY29tYm9Cb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldE1vZGVsKHRoaXMubW9kZWwpOwotCQkJaWYgKHRoaXMucmVuZGVyZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuY29tYm9Cb3guc2V0UmVuZGVyZXIodGhpcy5yZW5kZXJlcik7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvQm94LnNldEZvbnQodGFibGUuZ2V0Rm9udCgpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldEJvcmRlcih0aGlzLmJvcmRlcih0YWJsZSwgdmFsLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCX0KLQotCQkvLyBXZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIG1vZGVsIHNpbmNlIEpDb21ib0JveCBtaWdodCBwcmV2ZW50IHVzIGZyb20KLQkJLy8gc2VsZWN0aW5nIHRoZSB2YWx1ZS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBjb250YWluZWQKLQkJLy8gaW4gdGhlIG1vZGVsLCBzZWUgQ1IjMzk1MDA0NCBmb3IgYW4gZXhhbXBsZQotCQl0aGlzLm1vZGVsLnNldFNlbGVjdGVkSXRlbSh2YWwpOwotCi0JCXJldHVybiB0aGlzLmNvbWJvQm94OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGZvcmVncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGZvcmVncm91bmRDb2xvcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZvcmVncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgYmFja2dyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbCwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdEJhY2tncm91bmQ7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0QmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBib3JkZXIuCi0JICovCi0JcHJvdGVjdGVkIEJvcmRlciBib3JkZXIoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/Ci0JCQlVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKQotCQk6Ci0JCQlOT19GT0NVU19CT1JERVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjb21iby1ib3ggd2lsbCBsb29rIGdvb2QgaW4uLi4uCi0JICovCi0JcHVibGljIGludCBwcmVmZXJyZWRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1MjNlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogVXNlZCBieSBnZW5lcmFsLXB1cnBvc2UgVUkgbW9kZWxzIGFuZCByZW5kZXJlcnMgdG8gY2FzdAotICogYXBwbGljYXRpb24gbW9kZWwgb2JqZWN0cyB0byBzb21ldGhpbmcgZGlzcGxheWFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheWFibGUKLQlleHRlbmRzIE1vZGVsCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kZWwKLQkgKiBpbiBhIHRleHR1YWwgVUkgc2V0dGluZyAodHlwaWNhbGx5IHRoZSBvYmplY3QncyBuYW1lKS4KLQkgKiBXaGVuIHRoZSBkaXNwbGF5IHN0cmluZyBjaGFuZ2VzLCB0aGUgbW9kZWwgc2hvdWxkIGZpcmUKLQkgKiB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbjoKLQkgKiAgICAgdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGREaXNwbGF5U3RyaW5nLCB0aGlzLmRpc3BsYXlTdHJpbmcoKSk7Ci0JICovCi0JU3RyaW5nIGRpc3BsYXlTdHJpbmcoKTsKLQkJU3RyaW5nIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZID0gImRpc3BsYXlTdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgVUkgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgaWNvbnMgKHRoZSBpY29uIGNhbiBiZSBudWxsKS4KLQkgKiBXaGVuIHRoZSBpY29uIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCSAqLwotCUljb24gaWNvbigpOwotCQlTdHJpbmcgSUNPTl9QUk9QRVJUWSA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ODMwOGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi0vKioKLSAqIEltcGxlbWVudCB0aGUgSWNvbiBpbnRlcmZhY2Ugd2l0aCBhbiBpY29uIHRoYXQgaGFzIGEgc2l6ZSBidXQKLSAqIGRvZXMgbm90IHBhaW50IGFueXRoaW5nIG9uIHRoZSBncmFwaGljcyBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJY29uCi0JaW1wbGVtZW50cyBJY29uCi17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgaGVpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eUljb24gTlVMTF9JTlNUQU5DRSA9IG5ldyBFbXB0eUljb24oMCk7Ci0KLQotCXB1YmxpYyBFbXB0eUljb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JfQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgc2l6ZSkgewotCQl0aGlzKHNpemUsIHNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJY29uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7Ci0JCS8vIGRvbid0IHBhaW50IGFueXRoaW5nIGZvciBhbiBlbXB0eSBpY29uCi0JfQotCi0JcHVibGljIGludCBnZXRJY29uV2lkdGgoKSB7IAotCQlyZXR1cm4gdGhpcy53aWR0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25IZWlnaHQoKSB7Ci0JCXJldHVybiB0aGlzLmhlaWdodDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0QnJvd3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWYzZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExvbmdMaXN0Q29tcG9uZW50LkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFRoZSBKT1B0aW9uUGFuZQotICogaXMgcGFzc2VkIGEgRmlsdGVyaW5nTGlzdFBhbmVsIHRvIGFzc2lzdCB0aGUgdXNlciBpbiBtYWtpbmcKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdEJyb3dzZXI8VD4gCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQlwcml2YXRlIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBwYW5lbDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhbmVsID0gdGhpcy5idWlsZFBhbmVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBidWlsZFBhbmVsKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFQ+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUgd2l0aCBhIGZpbHRlcmluZwotCSAqIGxpc3QgcGFuZWwuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsJCi0JCXRoaXMuaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihjaG9vc2VyKTsKLQkJCi0JCWludCBvcHRpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm9wdGlvblR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCSk7Ci0JCQotCQlpZiAob3B0aW9uID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbSh0aGlzLnBhbmVsLnNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdGhlIHRleHQgZmllbGQgc28gdGhlIGxpc3QgYm94IGlzIHJlLWZpbHRlcmVkCi0JCXRoaXMucGFuZWwudGV4dEZpZWxkKCkuc2V0VGV4dCgiIik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDZWxsUmVuZGVyZXIoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCS8vIGRlZmF1bHQgYmVoYXZpb3Igc2hvdWxkIGJlIHRvIHVzZSB0aGUgY2VsbCByZW5kZXJlciBmcm9tIHRoZSBjb21ib2JveC4KLQkJdGhpcy5wYW5lbC5saXN0Qm94KCkuc2V0Q2VsbFJlbmRlcmVyKGNvbWJvQm94LmdldFJlbmRlcmVyKCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBtZXNzYWdlIGNhbiBiZSBhbnl0aGluZyAtIGhlcmUgd2UgYnVpbGQgYSBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2UoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXRoaXMucGFuZWwuc2V0Q29tcGxldGVMaXN0KHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSkpOwotCQl0aGlzLnBhbmVsLnNldFNlbGVjdGlvbihjb21ib0JveC5nZXRNb2RlbCgpLmdldFNlbGVjdGVkSXRlbSgpKTsKLQkJcmV0dXJuIHRoaXMucGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcHRpb25UeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuT0tfQ0FOQ0VMX09QVElPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSWNvbiBpY29uKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb25WYWx1ZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGN1c3RvbSBwYW5lbCAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbDxTPiBleHRlbmRzIEZpbHRlcmluZ0xpc3RQYW5lbDxTPiB7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JCXByb3RlY3RlZCBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbCgpIHsKLQkJCXN1cGVyKEVNUFRZX0FSUkFZLCBudWxsKTsKLQkJfQotCQotCQkvKioKLQkJICogRGlzYWJsZSB0aGUgcGVyZm9ybWFuY2UgdHdlYWsgYmVjYXVzZSBKT3B0aW9uUGFuZQotCQkgKiB3aWxsIHRyeSBvcGVuIHdpZGUgZW5vdWdoIHRvIGRpc2FibGUgdGhlIGhvcml6b250YWwgc2Nyb2xsIGJhcjsKLQkJICogYW5kIGl0IGxvb2tzIGEgYml0IGNsdW1zeS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvdHlwZUNlbGxWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMTdkZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlU3RyaW5nTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nTWF0Y2hlcjsKLQotLyoqCi0gKiBUaGlzIHBhbmVsIHByZXNlbnRzIGFuIGVudHJ5IGZpZWxkIGFuZCBhIGxpc3QgYm94IG9mIGNob2ljZXMgdGhhdAotICogYWxsb3dzIHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBib3ggYnkgZW50ZXJpbmcKLSAqIGEgcGF0dGVybiBpbiB0aGUgZW50cnkgZmllbGQuCi0gKiAKLSAqIEJ5IGRlZmF1bHQsIHR3byB3aWxkY2FyZHMgYXJlIGFsbG93ZWQgaW4gdGhlIHBhdHRlcm46Ci0gKiAJJyonIHdpbGwgbWF0Y2ggYW55IHNldCBvZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycwotICogCSc/JyB3aWxsIG1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyCi0gKiAKLSAqIFRoZSBwYW5lbCBjb25zaXN0cyBvZiA0IGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY3VzdG9taXplZDoKLSAqIAktIDEgdGV4dCBmaWVsZAotICogCS0gMSBsaXN0IGJveAotICogCS0gMiBsYWJlbHMsIG9uZSBmb3IgZWFjaCBvZiB0aGUgYWJvdmUKLSAqIAotICogT3RoZXIgYXNwZWN0cyBvZiB0aGUgcGFuZWwncyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZDoKLSAqIAktIHRoZSBzdHJpbmcgY29udmVydGVyIGRldGVybWluZXMgaG93IHRoZSBvYmplY3RzIGluIHRoZQotICogCQlsaXN0IGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgY29tcGFyZWQgdG8gdGhlIHBhdHRlcm4KLSAqIAkJZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZDsgYnkgZGVmYXVsdCB0aGUgY29udmVydGVyIHNpbXBseQotICogCQl1c2VzIHRoZSByZXN1bHQgb2YgdGhlIG9iamVjdCdzICN0b1N0cmluZygpIG1ldGhvZAotICogCQkoaWYgeW91IHJlcGxhY2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIsIHlvdSB3aWxsIHByb2JhYmx5Ci0gKiAJCXdhbnQgdG8gcmVwbGFjZSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyIGFsc28pCi0gKiAJLSB0aGUgc3RyaW5nIG1hdGNoZXIgY2FuIGFsc28gYmUgY2hhbmdlZCBpZiB5b3Ugd291bGQKLSAqIAkJbGlrZSBkaWZmZXJlbnQgcGF0dGVybiBtYXRjaGluZyBiZWhhdmlvciB0aGFuIHRoYXQKLSAqIAkJZGVzY3JpYmVkIGFib3ZlCi0gKiAJLSB5b3UgY2FuIHNwZWNpZnkgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbGlzdCAtIHRoaXMgbWF5Ci0gKiAJCWZvcmNlIHRoZSB1c2VyIHRvIGVudGVyIGEgcGF0dGVybiByZXN0cmljdGl2ZSBlbm91Z2gKLSAqIAkJdG8gcmVzdWx0IGluIGEgbGlzdCBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gc2l6ZTsgdGhlCi0gKiAJCWRlZmF1bHQgaXMgLTEsIHdoaWNoIGRpc2FibGVzIHRoZSByZXN0cmljdGlvbgotICogCi0gKiBUaGlzIHBhbmVsIGlzIG5vdCBhIHR5cGljYWwgcGFuZWwsIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRvZXMgbm90IHNoYXJlCi0gKiBpdHMgbW9kZWwgd2l0aCBjbGllbnRzIHZpYSB2YWx1ZSBtb2RlbHMuIEluc3RlYWQsIHRoaXMgcGFuZWwncyBtb2RlbAotICogaXMgc2V0IGFuZCBxdWVyaWVkIGRpcmVjdGx5IGJlY2F1c2UgaXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiBhCi0gKiBkaWFsb2cgdGhhdCBkaXJlY3RzIHRoZSB1c2VyJ3MgYmVoYXZpb3IgKGFzIG9wcG9zZWQgdG8gYSAibm9ybWFsIgotICogd2luZG93KS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBleHRlbmRzIEpQYW5lbCB7Ci0KLQkvKioKLQkgKiBUaGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcwotCSAqIChhcyBvcHBvc2VkIHRvIHRoZSBwYXJ0aWFsIGxpc3QgaGVsZCBieSB0aGUgbGlzdCBib3gpLgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gY29tcGxldGVMaXN0OwotCi0JLyoqCi0JICogQW4gYWRhcHRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMgaW4gdGhlIGxpc3QKLQkgKiB0byBzdHJpbmdzIHNvIHRoZXkgY2FuIGJlIHJ1biB0aHJvdWdoIHRoZSBtYXRjaGVyCi0JICogYW5kIGRpc3BsYXllZCBpbiB0aGUgdGV4dCBmaWVsZC4KLQkgKi8KLQlTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyOwotCi0JLyoqIFRoZSB0ZXh0IGZpZWxkLiAqLwotCXByaXZhdGUgSlRleHRGaWVsZCB0ZXh0RmllbGQ7Ci0JcHJpdmF0ZSBKTGFiZWwgdGV4dEZpZWxkTGFiZWw7Ci0JcHJpdmF0ZSBEb2N1bWVudExpc3RlbmVyIHRleHRGaWVsZExpc3RlbmVyOwotCi0JLyoqIFRoZSBsaXN0IGJveC4gKi8KLQlwcml2YXRlIEpMaXN0IGxpc3RCb3g7Ci0JcHJpdmF0ZSBKTGFiZWwgbGlzdEJveExhYmVsOwotCi0JLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guICovCi0JcHJpdmF0ZSBpbnQgbWF4TGlzdFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgbWF0Y2hlciB1c2VkIHRvIGZpbHRlciB0aGUgbGlzdCBhZ2FpbnN0Ci0JICogdGhlIHBhdHRlcm4gZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZC4gQnkgZGVmYXVsdCwKLQkgKiB0aGlzIGFsbG93cyB0aGUgdHdvIHdpbGRjYXJkIGNoYXJhY3RlcnMgZGVzY3JpYmVkIGluCi0JICogdGhlIGNsYXNzIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXI7Ci0KLQkvKioKLQkgKiBQZXJmb3JtYW5jZSB0d2VhazogV2UgdXNlIHRoaXMgYnVmZmVyIGluc3RlYWQgb2YKLQkgKiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBkdXJpbmcgZmlsdGVyaW5nIHNvIHdlIGRvbid0IGhhdmUKLQkgKiB0byBrZWVwIHJlLWFsbG9jYXRpbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBidWZmZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgVEVYVF9GSUVMRF9MQUJFTF9CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDAsIDUsIDApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBMSVNUX0JPWF9MQUJFTF9CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsIDAsIDUsIDApOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBGaWx0ZXJpbmdMaXN0UGFuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2hvaWNlcwotCSAqIGFuZCBpbml0aWFsIHNlbGVjdGlvbi4gVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUKLQkgKiBjaG9pY2VzIGFuZCBzZWxlY3Rpb24gdG8gc3RyaW5ncyAod2hpY2ggc2ltcGx5IGNhbGxzICN0b1N0cmluZygpIG9uCi0JICogdGhlIG9iamVjdHMpLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdMaXN0UGFuZWwoT2JqZWN0W10gY29tcGxldGVMaXN0LCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzKGNvbXBsZXRlTGlzdCwgaW5pdGlhbFNlbGVjdGlvbiwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFQ+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgRmlsdGVyaW5nTGlzdFBhbmVsIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNob2ljZXMKLQkgKiBhbmQgaW5pdGlhbCBzZWxlY3Rpb24uIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUKLQkgKiBjaG9pY2VzIGFuZCBzZWxlY3Rpb24gdG8gc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nTGlzdFBhbmVsKE9iamVjdFtdIGNvbXBsZXRlTGlzdCwgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJc3VwZXIobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy5jb21wbGV0ZUxpc3QgPSBjb21wbGV0ZUxpc3Q7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLmluaXRpYWxpemUoaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCXRoaXMubWF4TGlzdFNpemUgPSB0aGlzLmRlZmF1bHRNYXhMaXN0U2l6ZSgpOwotCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQotCQl0aGlzLnRleHRGaWVsZExpc3RlbmVyID0gdGhpcy5idWlsZFRleHRGaWVsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5zdHJpbmdNYXRjaGVyID0gdGhpcy5idWlsZFN0cmluZ01hdGNoZXIoKTsKLQotCQl0aGlzLmluaXRpYWxpemVMYXlvdXQoaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZEJ1ZmZlcigpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbdGhpcy5tYXgoKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG1heCBudW1iZXIgb2YgZW50cmllcyBhbGxvd2VkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcml2YXRlIGludCBtYXgoKSB7Ci0JCWlmICh0aGlzLm1heExpc3RTaXplID09IC0xKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoOwotCQl9Ci0JCXJldHVybiBNYXRoLm1pbih0aGlzLm1heExpc3RTaXplLCB0aGlzLmNvbXBsZXRlTGlzdC5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGxpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSB0ZXh0IGZpZWxkCi0JICogYW5kIGZpbHRlciB0aGUgbGlzdCBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByaXZhdGUgRG9jdW1lbnRMaXN0ZW5lciBidWlsZFRleHRGaWVsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5maWx0ZXJMaXN0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGVmYXVsdE1heExpc3RTaXplKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIGJ1aWxkU3RyaW5nTWF0Y2hlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJpbmdNYXRjaGVyPFQ+KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMYXlvdXQoT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJLy8gdGV4dCBmaWVsZAotCQlKUGFuZWwgdGV4dEZpZWxkUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0Qm9yZGVyKFRFWFRfRklFTERfTEFCRUxfQk9SREVSKTsKLQkJdGV4dEZpZWxkUGFuZWwuYWRkKHRoaXMudGV4dEZpZWxkTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJdGhpcy50ZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotCQl0aGlzLnRleHRGaWVsZC5nZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy50ZXh0RmllbGRMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0TGFiZWxGb3IodGhpcy50ZXh0RmllbGQpOwotCQl0ZXh0RmllbGRQYW5lbC5hZGQodGhpcy50ZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0JCXRoaXMuYWRkKHRleHRGaWVsZFBhbmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCS8vIGxpc3QgYm94Ci0JCUpQYW5lbCBsaXN0Qm94UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMubGlzdEJveExhYmVsID0gbmV3IEpMYWJlbCgpOwotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRCb3JkZXIoTElTVF9CT1hfTEFCRUxfQk9SREVSKTsKLQkJbGlzdEJveFBhbmVsLmFkZCh0aGlzLmxpc3RCb3hMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQl0aGlzLmxpc3RCb3ggPSBuZXcgSkxpc3QoKTsKLQkJdGhpcy5saXN0Qm94LnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQl0aGlzLmxpc3RCb3guc2V0TW9kZWwodGhpcy5idWlsZFBhcnRpYWxBcnJheUxpc3RNb2RlbCh0aGlzLmNvbXBsZXRlTGlzdCwgdGhpcy5tYXgoKSkpOwotCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLQkJLy8gcGVyZm9ybWFuY2UgdHdlYWsoPykKLQkJdGhpcy5saXN0Qm94LnNldFByb3RvdHlwZUNlbGxWYWx1ZSh0aGlzLnByb3RvdHlwZUNlbGxWYWx1ZSgpKTsKLQkJdGhpcy5saXN0Qm94LnNldFByb3RvdHlwZUNlbGxWYWx1ZShudWxsKTsKLQkJdGhpcy5saXN0Qm94LnNldENlbGxSZW5kZXJlcih0aGlzLmJ1aWxkRGVmYXVsdENlbGxSZW5kZXJlcigpKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0TGFiZWxGb3IodGhpcy5saXN0Qm94KTsKLQkJLy8gYnVnIDI3Nzc4MDIgLSBzY3JvbGwgYmFycyBzaG91bGRuJ3QgYmUgb24gdGhlIHRhYiBzZXF1ZW5jZQotCQlKU2Nyb2xsUGFuZSBsaXN0Qm94U2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZSh0aGlzLmxpc3RCb3gpOwotCQlsaXN0Qm94U2Nyb2xsUGFuZS5nZXRIb3Jpem9udGFsU2Nyb2xsQmFyKCkuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLQkJbGlzdEJveFNjcm9sbFBhbmUuZ2V0VmVydGljYWxTY3JvbGxCYXIoKS5zZXRGb2N1c2FibGUoZmFsc2UpOwotCQlsaXN0Qm94UGFuZWwuYWRkKGxpc3RCb3hTY3JvbGxQYW5lLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotCQkvLyBpbml0aWFsaXplIHRoZSB3aWRnZXRzCi0JCXRoaXMubGlzdEJveC5zZXRTZWxlY3RlZFZhbHVlKGluaXRpYWxTZWxlY3Rpb24sIHRydWUpOwotCQl0aGlzLnRleHRGaWVsZC5zZWxlY3QoMCwgdGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQotCQl0aGlzLmFkZChsaXN0Qm94UGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3Qgc2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94LmdldFNlbGVjdGVkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGlvbikgewotCQl0aGlzLmxpc3RCb3guc2V0U2VsZWN0ZWRWYWx1ZShzZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBjb21wbGV0ZUxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBsZXRlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiByZWJ1aWxkIHRoZSBmaWx0ZXJpbmcgYnVmZmVyIGFuZCByZS1hcHBseSB0aGUgZmlsdGVyCi0JICogdG8gdGhlIG5ldyBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcGxldGVMaXN0KE9iamVjdFtdIGNvbXBsZXRlTGlzdCkgewotCQl0aGlzLmNvbXBsZXRlTGlzdCA9IGNvbXBsZXRlTGlzdDsKLQkJaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IHRoaXMubWF4KCkpIHsKLQkJCS8vIHRoZSBidWZmZXIgd2lsbCBuZXZlciBzaHJpbmsgLSBtaWdodCB3YW50IHRvIHJlLWNvbnNpZGVyLi4uICB+Ymp2Ci0JCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQkJfQotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG1heExpc3RTaXplKCkgewotCQlyZXR1cm4gdGhpcy5tYXhMaXN0U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhMaXN0U2l6ZShpbnQgbWF4TGlzdFNpemUpIHsKLQkJdGhpcy5tYXhMaXN0U2l6ZSA9IG1heExpc3RTaXplOwotCQlpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgdGhpcy5tYXgoKSkgewotCQkJLy8gdGhlIGJ1ZmZlciB3aWxsIG5ldmVyIHNocmluayAtIG1pZ2h0IHdhbnQgdG8gcmUtY29uc2lkZXIuLi4gIH5ianYKLQkJCXRoaXMuYnVmZmVyID0gdGhpcy5idWlsZEJ1ZmZlcigpOwotCQl9Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogYXBwbHkgdGhlIG5ldyBmaWx0ZXIgdG8gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikgewotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSB0ZXh0IGZpZWxkCi0JICogKHNvIHdlIGNhbiBzZXQgdGhlIGZvY3VzKQotCSAqLwotCXB1YmxpYyBKVGV4dEZpZWxkIHRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEZpZWxkOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgdGV4dCBmaWVsZCBsYWJlbAotCSAqLwotCXB1YmxpYyBKTGFiZWwgdGV4dEZpZWxkTGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRGaWVsZExhYmVsOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRGaWVsZExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSBsaXN0IGJveAotCSAqIChzbyB3ZSBjYW4gYWRkIG1vdXNlIGxpc3RlbmVycyBmb3IgZG91YmxlLWNsaWNraW5nKQotCSAqLwotCXB1YmxpYyBKTGlzdCBsaXN0Qm94KCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94OwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RCb3hDZWxsUmVuZGVyZXIoTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzLmxpc3RCb3guc2V0Q2VsbFJlbmRlcmVyKHJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIGxpc3QgYm94IGxhYmVsCi0JICovCi0JcHVibGljIEpMYWJlbCBsaXN0Qm94TGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RCb3hMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0Qm94TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50c0ZvbnQoRm9udCBmb250KSB7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0Rm9udChmb250KTsKLQkJdGhpcy50ZXh0RmllbGQuc2V0Rm9udChmb250KTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0Rm9udChmb250KTsKLQkJdGhpcy5saXN0Qm94LnNldEZvbnQoZm9udCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ01hdGNoZXIgc3RyaW5nTWF0Y2hlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nTWF0Y2hlcjsKLQl9Ci0KLQkvKioKLQkgKiByZS1hcHBseSB0aGUgZmlsdGVyIHRvIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nTWF0Y2hlcihTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXIpIHsKLQkJdGhpcy5zdHJpbmdNYXRjaGVyID0gc3RyaW5nTWF0Y2hlcjsKLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3cgc3ViY2xhc3NlcyB0byBkaXNhYmxlIHBlcmZvcm1hbmNlIHR3ZWFrCi0JICogYnkgcmV0dXJuaW5nIG51bGwgaGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvdHlwZUNlbGxWYWx1ZSgpIHsKLQkJcmV0dXJuICI9PT09PT09PT09PiBBX1NUUklOR19USEFUX0lTX0RFRklOSVRFTFlfTE9OR0VSX1RIQU5fRVZFUllfU1RSSU5HX0lOX1RIRV9MSVNUIDw9PT09PT09PT09IjsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCB1c2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIgdG8gYnVpbGQgdGhlIHRleHQKLQkgKiB1c2VkIGJ5IHRoZSBsaXN0IGJveCdzIGNlbGwgcmVuZGVyZXIuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDZWxsUmVuZGVyZXIgYnVpbGREZWZhdWx0Q2VsbFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoKFQpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBTb21ldGhpbmcgaGFzIGNoYW5nZWQgdGhhdCByZXF1aXJlcyB1cyB0byBmaWx0ZXIgdGhlIGxpc3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgc3luY2hyb25pemVkIGJlY2F1c2UgYSBmYXN0IHR5cGlzdCBjYW4KLQkgKiBnZW5lcmF0ZSBldmVudHMgcXVpY2tlciB0aGFuIHdlIGNhbiBmaWx0ZXIgdGhlIGxpc3QuICg/ICB+Ymp2KQotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGZpbHRlckxpc3QoKSB7Ci0JCS8vIHRlbXBvcmFyaWx5IHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGJveCBzZWxlY3Rpb24sIHNpbmNlIHdlIHdpbGwKLQkJLy8gYmUgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbiBkdXJpbmcgdGhlIGZpbHRlcmluZyBhbmQgZG9uJ3Qgd2FudAotCQkvLyB0aGF0IHRvIGFmZmVjdCB0aGUgdGV4dCBmaWVsZAotCQl0aGlzLmZpbHRlckxpc3QodGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGJveCB0byBtYXRjaCB0aGUKLQkgKiBzcGVjaWZpZWQgcGF0dGVybi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlsdGVyTGlzdChTdHJpbmcgcGF0dGVybikgewotCQlpZiAocGF0dGVybi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RCb3guc2V0TW9kZWwodGhpcy5idWlsZFBhcnRpYWxBcnJheUxpc3RNb2RlbCh0aGlzLmNvbXBsZXRlTGlzdCwgdGhpcy5tYXgoKSkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zdHJpbmdNYXRjaGVyLnNldFBhdHRlcm5TdHJpbmcocGF0dGVybik7Ci0JCQlpbnQgaiA9IDA7Ci0JCQlpbnQgbGVuID0gdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoOwotCQkJaW50IG1heCA9IHRoaXMubWF4KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKHRoaXMuc3RyaW5nTWF0Y2hlci5tYXRjaGVzKHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyh0aGlzLmVudHJ5KGkpKSkpIHsKLQkJCQkJdGhpcy5idWZmZXJbaisrXSA9IHRoaXMuY29tcGxldGVMaXN0W2ldOwotCQkJCX0KLQkJCQlpZiAoaiA9PSBtYXgpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5idWZmZXIsIGopKTsKLQkJfQotCi0JCS8vIGFmdGVyIGZpbHRlcmluZyB0aGUgbGlzdCwgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBzZWxlY3Rpb24KLQkJaWYgKHRoaXMubGlzdEJveC5nZXRNb2RlbCgpLmdldFNpemUoKSA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5jbGVhclNlbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoMCk7Ci0JCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRMZWFkU2VsZWN0aW9uSW5kZXgoMCk7Ci0JCQl0aGlzLmxpc3RCb3guZW5zdXJlSW5kZXhJc1Zpc2libGUoMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBUIGVudHJ5KGludCBpbmRleCkgewotCQlyZXR1cm4gKFQpIHRoaXMuY29tcGxldGVMaXN0W2luZGV4XTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGxpc3QgbW9kZWwgdGhhdCB3cmFwcyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBtb2RlbCB3aWxsIGluY2x1ZGUgdGhlIGFycmF5IGVudHJpZXMgZnJvbSAwIHRvIChzaXplIC0gMSkuCi0JICovCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwoZmluYWwgT2JqZWN0W10gYXJyYXksIGZpbmFsIGludCBzaXplKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RMaXN0TW9kZWwoKSB7Ci0JCQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCQkJcmV0dXJuIHNpemU7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJCQlyZXR1cm4gYXJyYXlbaW5kZXhdOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0xpc3RDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTFiMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0xpc3RDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkFXVEV2ZW50OwotaW1wb3J0IGphdmEuYXd0LkFXVEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNDb21ib0JveFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSB3YXkgdG8gaGFuZGxlIHNlbGVjdGluZyBhbiBpdGVtIGZyb20gYQotICogbGlzdCB0aGF0IG1heSBncm93IHRvbyBsYXJnZSB0byBiZSBoYW5kbGVkIGNvbnZlbmllbnRseSBieSBhIGNvbWJvLWJveC4gCi0gKiBJZiB0aGUgbGlzdCdzIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBkZXNpZ25hdGVkICJsb25nIiBsaXN0IHNpemUsIAotICogdGhlIGNob2ljZSBsaXN0IHdpbGwgYmUgZGlzcGxheWVkIGluIGEgbm9ybWFsIGNvbWJvLWJveCBwb3B1cDsgCi0gKiBvdGhlcndpc2UsIGEgZGlhbG9nIHdpbGwgYmUgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgdG8gY2hvb3NlIGEgc2VsZWN0aW9uLgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIGJyb3dzZSBtZWNoYW5pc20sIHN1YmNsYXNzZXMgbWF5IAotICogCS0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnVpbGRCcm93c2VyKCkKLSAqICAtIG92ZXJyaWRlIHRoZSBtZXRob2QgI2Jyb3dzZSgpLCBpbiB3aGljaCBjYXNlIHRoZSBtZXRob2QgCi0gKiAJCSNidWlsZEJyb3dzZXIoKSBtYXkgYmUgaWdub3JlZC4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDaG9vc2VyIAotCWV4dGVuZHMgSkNvbWJvQm94Ci17Ci0JCi0JLyoqIHRoZSBzaXplIG9mIGEgImxvbmciIGxpc3QgLSBhbnl0aGluZyBzbWFsbGVyIGlzIGEgInNob3J0IiBsaXN0ICovCi0JaW50IGxvbmdMaXN0U2l6ZSA9IERFRkFVTFRfTE9OR19MSVNUX1NJWkU7Ci0JCi0JLyoqIHRoZSBkZWZhdWx0IHNpemUgb2YgYSAibG9uZyIgbGlzdCwgd2hpY2ggaXMgMjAgKHRvIG1hdGNoIEpPcHRpb25QYW5lJ3MgYmVoYXZpb3IpICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9MT05HX0xJU1RfU0laRSA9IDIwOwotCQotCS8qKiBwcm9wZXJ0eSBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIGxvbmcgbGlzdCBzaXplICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19MSVNUX1NJWkVfUFJPUEVSVFkgPSAibG9uZ0xpc3RTaXplIjsgLy8kTk9OLU5MUy0xJAotCQotICAgIHN0YXRpYyBKTGFiZWwgcHJvdG90eXBlTGFiZWwgPSBuZXcgSkxhYmVsKCJQcm90b3R5cGUiLCBuZXcgRW1wdHlJY29uKDE3KSwgU3dpbmdDb25zdGFudHMuTEVBRElORyk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiAKLQkgKiB3aGV0aGVyIHRoZSBjaG9vc2VyIGlzIGNob29zYWJsZS4gIGlmIGEgY2hvb3NlciBpcyBub3QgY2hvb3NhYmxlLAotCSAqIGl0IG9ubHkgc2VydmVzIGFzIGEgZGlzcGxheSB3aWRnZXQuICBhIHVzZXIgbWF5IG5vdCBjaGFuZ2UgaXRzIAotCSAqIHNlbGVjdGVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gY2hvb3NhYmxlID0gdHJ1ZTsKLQkKLQkvKiogcHJvcGVydHkgY2hhbmdlIGFzc29jaWF0ZWQgd2l0aCBjaG9vc2FibGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9PU0FCTEVfUFJPUEVSVFkgPSAiY2hvb3NhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0aGUgYnJvd3NlciB1c2VkIHRvIG1ha2UgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbG9uZyBsaXN0IC0gdHlwaWNhbGx5IHZpYSBhIGRpYWxvZyAqLwotCXByaXZhdGUgTGlzdEJyb3dzZXIgYnJvd3NlcjsKLQkKLSAgICBwcml2YXRlIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3I7Ci0gICAgCi0JLyoqIElOVEVSTkFMIC0gVGhlIHBvcHVwIGlzIGJlaW5nIHNob3duLiAgVXNlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3AuICovCi0JYm9vbGVhbiBwb3B1cEFscmVhZHlJblByb2dyZXNzOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogQ29uc3RydWN0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hvb3NlciBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdENob29zZXIoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKG1vZGVsLCBuZXcgTm9kZVNlbGVjdG9yLkRlZmF1bHROb2RlU2VsZWN0b3IoKSk7Ci0JfQotCQotICAgIHB1YmxpYyBMaXN0Q2hvb3NlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzKG1vZGVsLCBuZXcgTm9kZVNlbGVjdG9yLkRlZmF1bHROb2RlU2VsZWN0b3IoKSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsLCBOb2RlU2VsZWN0b3Igbm9kZVNlbGVjdG9yKSB7Ci0gICAgICAgIHRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSwgbm9kZVNlbGVjdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsLCBOb2RlU2VsZWN0b3Igbm9kZVNlbGVjdG9yKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsKTsKLSAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7Ci0gICAgICAgIHRoaXMubm9kZVNlbGVjdG9yID0gbm9kZVNlbGVjdG9yOwotICAgIH0KLQkvLyAqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmFkZFBvcHVwTWVudUxpc3RlbmVyKHRoaXMuYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpKTsKLQkJdGhpcy5zZXRSZW5kZXJlcihuZXcgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIoKSk7Ci0gICAgICAgIHRoaXMuYWRkS2V5TGlzdGVuZXIoYnVpbGRGM0tleUxpc3RlbmVyKCkpOwotICAgICAgICAKLSAgICAgICAgLy9UaGVzZSBhcmUgdXNlZCB0byB3b3JrYXJvdW5kIHByb2JsZW1zIHdpdGggU3dpbmcgdHJ5aW5nIHRvIAotICAgICAgICAvL2RldGVybWluZSB0aGUgc2l6ZSBvZiBhIGNvbWJvQm94IHdpdGggYSBsYXJnZSBtb2RlbAotICAgICAgICBzZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICBsaXN0Qm94KCkuc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLQl9Ci0JCi0gICAgCi0gICAgcHJpdmF0ZSBKTGlzdCBsaXN0Qm94KCkgewotICAgICAgICByZXR1cm4gKEpMaXN0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUodGhpcy51aSwgImxpc3RCb3giKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLQkvKiogCi0JICogV2hlbiB0aGUgcG9wdXAgaXMgYWJvdXQgdG8gYmUgc2hvd24sIHRoZSBldmVudCBpcyBjb25zdW1lZCwgYW5kIAotCSAqIFBvcHVwSGFuZGxlciBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmVzaG93IHRoZSBwb3B1cCBvciB0byBzaG93Ci0JICogdGhlIGxvbmcgbGlzdCBicm93c2VyLgotCSAqLwotCXByaXZhdGUgUG9wdXBNZW51TGlzdGVuZXIgYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQlMaXN0Q2hvb3Nlci50aGlzLmFib3V0VG9TaG93UG9wdXAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVJbnZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudUNhbmNlbGVkKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwb3AtdXAgbWVudSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhpcyBjb2RlIGlzIGJlaW5nIHJlYWNoZWQgZHVlIHRvIHRoZSBQb3B1cEhhbmRsZXIgYWxyZWFkeSBiZWluZyBpbiBwcm9ncmVzcywKLQkgKiB0aGVuIGRvIG5vdGhpbmcuICBPdGhlcndpc2UsIHNldCB0aGUgZmxhZyB0byB0cnVlIGFuZCBsYXVuY2ggdGhlIFBvcHVwSGFuZGxlci4KLQkgKi8KLQl2b2lkIGFib3V0VG9TaG93UG9wdXAoKSB7Ci0JCWlmICh0aGlzLnBvcHVwQWxyZWFkeUluUHJvZ3Jlc3MpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5wb3B1cEFscmVhZHlJblByb2dyZXNzID0gdHJ1ZTsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUG9wdXBIYW5kbGVyKCkpOwotCX0KLSAKLSAgICAKLQlwcml2YXRlIEtleUxpc3RlbmVyIGJ1aWxkRjNLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfRjMpIHsKLSAgICAgICAgICAgICAgICAgICAgZ29Ub1NlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJGMyBrZXkgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdvVG9TZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgIGlmIChnZXRTZWxlY3RlZEl0ZW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0Q2hvb3Nlci50aGlzLm5vZGVTZWxlY3Rvci5zZWxlY3ROb2RlRm9yKGdldFNlbGVjdGVkSXRlbSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLQkvLyAqKioqKioqKioqKioqKioqIEJyb3dzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogCi0JICogTGF6aWx5IGluaXRpYWxpemUgYmVjYXVzZSBzdWJjbGFzc2VzIG1heSBoYXZlIGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24gdG8gZG8KLQkgKiBiZWZvcmUgYnJvd3NlciBjYW4gYmUgYnVpbHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJvd3NlKCkgewotCQlpZiAodGhpcy5icm93c2VyID09IG51bGwpIHsKLQkJCXRoaXMuYnJvd3NlciA9IHRoaXMuYnVpbGRCcm93c2VyKCk7Ci0JCX0KLQkJCi0JCXRoaXMuYnJvd3Nlci5icm93c2UodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgImJyb3dzZXIiIHVzZWQgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBsb25nIGxpc3QsCi0JICogdHlwaWNhbGx5IHZpYSBhIGRpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENob29zZXIuTGlzdEJyb3dzZXIgYnVpbGRCcm93c2VyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RCcm93c2VyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogQ2hvb3NhYmxlIGZ1bmN0aW9uYWxpdHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiBvdmVycmlkZSBiZWhhdmlvciAtIGNvbnN1bWUgc2VsZWN0aW9uIGlmIGNob29zZXIgaXMgbm90IGNob29zYWJsZSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50IGFuSW5kZXgpIHsKLQkJaWYgKHRoaXMuY2hvb3NhYmxlKSB7Ci0JCQlzdXBlci5zZXRTZWxlY3RlZEluZGV4KGFuSW5kZXgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVBcnJvd0J1dHRvbigpIHsKLQkJdHJ5IHsKLQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJSkJ1dHRvbiBhcnJvd0J1dHRvbiA9IChKQnV0dG9uKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFycm93QnV0dG9uLnNldEVuYWJsZWQodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmNob29zYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JCi0gICAgLy8gKioqKioqKioqKioqKioqKiBMaXN0IENhY2hpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgdm9pZCBjYWNoZUxpc3QoKSB7Ci0gICAgICAgICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmNhY2hlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHVuY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS51bmNhY2hlTGlzdCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkuaXNDYWNoZWQoKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBQdWJsaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGludCBsb25nTGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxvbmdMaXN0U2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ0xpc3RTaXplKGludCBuZXdMb25nTGlzdFNpemUpIHsKLQkJaW50IG9sZExvbmdMaXN0U2l6ZSA9IHRoaXMubG9uZ0xpc3RTaXplOwotCQl0aGlzLmxvbmdMaXN0U2l6ZSA9IG5ld0xvbmdMaXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoTE9OR19MSVNUX1NJWkVfUFJPUEVSVFksIG9sZExvbmdMaXN0U2l6ZSwgbmV3TG9uZ0xpc3RTaXplKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaG9vc2FibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNob29zYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hvb3NhYmxlKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuY2hvb3NhYmxlOwotCQl0aGlzLmNob29zYWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZShDSE9PU0FCTEVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMudXBkYXRlQXJyb3dCdXR0b24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBIYW5kbGUgc2VsZWN0aW5nIG51bGwgYXMgYSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWRJbmRleElzTm9uZVNlbGVjdGVkSXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4ID09IC0xICYmCi0JCQkJIGdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gMCAmJgotCQkJCSBnZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSA9PSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkvLyBVc2UgaW5kZXggMCB0byBzaG93IHRoZSA8bm9uZSBzZWxlY3RlZD4gaXRlbSBzaW5jZSB0aGUgYWN0dWFsIHZhbHVlIGlzCi0JCS8vIG51bGwgYW5kIEpDb21ib0JveCBkb2VzIG5vdCBoYW5kbGUgbnVsbCB2YWx1ZXMKLQkJaWYgKHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW5kZXgpKSB7Ci0JCQlpbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gaW5kZXg7Ci0gICB9Ci0JCi0JLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gcHJvdG90eXBlTGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmaW5lIHRoZSBBUEkgcmVxdWlyZWQgYnkgdGhpcyBMaXN0Q2hvb3NlciB3aGVuIGl0IG11c3QKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGl0ZW0gZnJvbSB0aGUgImxvbmciIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0QnJvd3NlciAKLQl7Ci0JCS8qKgotCQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkJICogY29tYm8tYm94J3MgbW9kZWwuCi0JCSAqLwotCQl2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBwYXJlbnRDaG9vc2VyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUnVubmFibGUgY2xhc3MgdGhhdCBjb25zdW1lcyBwb3B1cCB3aW5kb3cgYW5kIGRldGVybWluZXMgd2hldGhlcgotCSAqIHRvIHJlc2hvdyBwb3B1cCBvciB0byBsYXVuY2ggYnJvd3NlciwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3B1cEhhbmRsZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqIFRoZSBtb3VzZSBldmVudCAqLwotCQlwcml2YXRlIE1vdXNlRXZlbnQgbGFzdE1vdXNlRXZlbnQ7Ci0JCQotCQkvKiogVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBKQ29tcG9uZW50IGV2ZW50Q29tcG9uZW50OwotCQkKLQkJLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBjb21wb25lbnRMb2NhdGlvbjsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBtb3VzZUxvY2F0aW9uOwotCQkKLQkJCi0JCVBvcHVwSGFuZGxlcigpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUFXVEV2ZW50IGV2ZW50ID0gRXZlbnRRdWV1ZS5nZXRDdXJyZW50RXZlbnQoKTsKLQkJCQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkgewotCQkJCXRoaXMubGFzdE1vdXNlRXZlbnQgPSAoTW91c2VFdmVudCkgZXZlbnQ7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IChKQ29tcG9uZW50KSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFNvdXJjZSgpOwotCQkJCXRoaXMuY29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFBvaW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmV2ZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gbnVsbDsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaXN0Q2hvb3Nlci50aGlzLmhpZGVQb3B1cCgpOwotCQkJCi0gICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmNob29zYWJsZSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIGNvbWJvIGJveCBtb2RlbCBpcyBvZiBzdWZmaWNpZW50IGxlbmd0aCwgdGhlIGJyb3dzZXIgd2lsbCBiZSBzaG93bi4KLQkJCQkvLyBBc2tpbmcgdGhlIGNvbWJvIGJveCBtb2RlbCBmb3IgaXRzIHNpemUgc2hvdWxkIGJlIGVub3VnaCB0byBlbnN1cmUgdGhhdCAKLQkJCQkvLyAgaXRzIHNpemUgaXMgcmVjYWxjdWxhdGVkLgotCQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gTGlzdENob29zZXIudGhpcy5sb25nTGlzdFNpemUpIHsKLQkJCQkJdGhpcy5jaGVja0NvbWJvQm94QnV0dG9uKCk7Ci0JCQkJCUxpc3RDaG9vc2VyLnRoaXMuYnJvd3NlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLnNob3dQb3B1cCgpOwotCQkJCQl0aGlzLmNoZWNrTW91c2VQb3NpdGlvbigpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0JCQkKLQkJCUxpc3RDaG9vc2VyLnRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGJ1dHRvbiBuZXZlciBiZWNvbWVzIHVuLXByZXNzZWQgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29tYm9Cb3hCdXR0b24oKSB7Ci0JCQl0cnkgewotCQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgQ2xhc3NUb29scy5maWVsZFZhbHVlKGNvbWJvQm94VWksICJhcnJvd0J1dHRvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXJyb3dCdXR0b24uZ2V0TW9kZWwoKS5zZXRQcmVzc2VkKGZhbHNlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkJLy8gc28gaWYgaXQgZG9lc24ndCB3b3JrLCBqdXN0IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbgotCQkJCXRoaXMuaGFuZGxlRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBNb3ZlcyB0aGUgbW91c2UgYmFjayB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24gYmVmb3JlIGFueSBqaWdnZXJ5IHBva2VyeSB0aGF0IHdlJ3ZlIGRvbmUuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY2hlY2tNb3VzZVBvc2l0aW9uKCkgewotCQkJaWYgKHRoaXMuZXZlbnRDb21wb25lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZmluYWwgUG9pbnQgbmV3Q29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCWJvb2xlYW4gY29tcG9uZW50TW92ZWQgPSAKLQkJCQluZXdDb21wb25lbnRMb2NhdGlvbi54IC0gdGhpcy5jb21wb25lbnRMb2NhdGlvbi54ICE9IDAKLQkJCQl8fCBuZXdDb21wb25lbnRMb2NhdGlvbi55IC0gdGhpcy5jb21wb25lbnRMb2NhdGlvbi55ICE9IDA7Ci0JCQkKLQkJCWlmIChjb21wb25lbnRNb3ZlZCkgewotCQkJCXRyeSB7Ci0JCQkJCW5ldyBSb2JvdCgpLm1vdXNlTW92ZSgKLQkJCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnggKyB0aGlzLm1vdXNlTG9jYXRpb24ueCwKLQkJCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnkgKyB0aGlzLm1vdXNlTG9jYXRpb24ueQotCQkJCQkpOwotCQkJCX0KLQkJCQljYXRjaCAoQVdURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIG1vdmUgZmFpbGVkIC0gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNGQxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi0vKioKLSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEYzIG9yIGNob29zZXMKLSAqICdHbyBUbycgaW4gdGhlIGNvbnRleHQgbWVudQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVTZWxlY3RvciAKLXsgICAgICAgCi0gICAgLyoqCi0gICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBOb2RlIGluIHRoZSB0cmVlIG9yIHRoZSBlZGl0b3IgcGFuZWwuCi0gICAgICovCi0gICAgdm9pZCBzZWxlY3ROb2RlRm9yKE9iamVjdCBpdGVtKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIE5vZGVTZWxlY3RvciB3aWxsIGRvIG5vdGhpbmcgd2hlbiBzZWxlY3ROb2RlRm9yKE9iamVjdCkgaXMgY2FsbGVkCi0gICAgICovCi0gICAgY2xhc3MgRGVmYXVsdE5vZGVTZWxlY3RvciBpbXBsZW1lbnRzIE5vZGVTZWxlY3RvciB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3ROb2RlRm9yKE9iamVjdCBpdGVtKSB7Ci0gICAgICAgICAgICAvL2RlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzIyNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENhY2hpbmdDb21ib0JveE1vZGVsIGludGVyZmFjZSBjYW4gYmUgdXNlZAotICogd2hlbmV2ZXIgdGhlcmUgaXMgbm8gbmVlZCBmb3IgY2FjaGluZyAoaS5lLiB0aGUgY29udGVudHMgb2YgdGhlIHNlbGVjdGlvbgotICogbGlzdCBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggbGl0dGxlIGxhdGVuY3kpLiBBbGwgdGhlIG5vcm1hbCBDb21ib0JveE1vZGVsCi0gKiBiZWhhdmlvciBpcyBkZWxlZ2F0ZWQgdG8gYSBjbGllbnQtc3VwcGxpZWQgQ29tYm9Cb3hNb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIE5vbkNhY2hpbmdDb21ib0JveE1vZGVsIGltcGxlbWVudHMgQ2FjaGluZ0NvbWJvQm94TW9kZWwgewotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCB3cmFwcGVkQ29tYm9Cb3hNb2RlbDsKLQotCXB1YmxpYyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbChDb21ib0JveE1vZGVsIHdyYXBwZWRDb21ib0JveE1vZGVsKSB7Ci0JCXRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwgPSB3cmFwcGVkQ29tYm9Cb3hNb2RlbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2FjaGluZ0NvbWJvQm94TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY2FjaGVMaXN0KCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmNhY2hlTGlzdCgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDYWNoZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IGFuSXRlbSkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLnNldFNlbGVjdGVkSXRlbShhbkl0ZW0pOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5nZXRTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0U2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCXRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcihsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIobCk7Ci0JfSAgCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZURpc3BsYXlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwY2NkZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZURpc3BsYXlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIERpc3BsYXlhYmxlIGNvbnZlcnRzIGFueSBPYmplY3QKLSAqIHRvIGEgRGlzcGxheWFibGUuIFN1YmNsYXNzIGl0IHRvIG92ZXJyaWRlICNkaXNwbGF5U3RyaW5nKCkgYW5kCi0gKiAjaWNvbigpIGlmIG5lY2Vzc2FyeS4gQ2hhbmdlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGZpcmVkIGlmIHRoZQotICogb2JqZWN0IGlzIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIFN0cmluZ3MgLSB0aGUgZGlzcGxheSBzdHJpbmcKLSAqIHdpbGwgc2ltcGx5IGJlIHRoZSBTdHJpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGlzcGxheWFibGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIERpc3BsYXlhYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGEgRGlzcGxheWFibGUuICovCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRpc3BsYXlhYmxlIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoT2JqZWN0IG9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoY2hhciBjKSB7Ci0JCXRoaXMoQ2hhcmFjdGVyLnZhbHVlT2YoYykpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShieXRlIGIpIHsKLQkJdGhpcyhCeXRlLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShzaG9ydCBzKSB7Ci0JCXRoaXMoU2hvcnQudmFsdWVPZihzKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGludCBpKSB7Ci0JCXRoaXMoSW50ZWdlci52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUobG9uZyBsKSB7Ci0JCXRoaXMoTG9uZy52YWx1ZU9mKGwpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoZmxvYXQgZikgewotCQl0aGlzKEZsb2F0LnZhbHVlT2YoZikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShkb3VibGUgZCkgewotCQl0aGlzKERvdWJsZS52YWx1ZU9mKGQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGlzcGxheWFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3QudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlTdHJpbmcgPSB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJSWNvbiBvbGRJY29uID0gdGhpcy5pY29uKCk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZERpc3BsYXlTdHJpbmcsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElDT05fUFJPUEVSVFksIG9sZEljb24sIHRoaXMuaWNvbigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkgewotCQlyZXR1cm4gKChCb29sZWFuKSB0aGlzLm9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhbihib29sZWFuIGIpIHsKLQkJdGhpcy5zZXRPYmplY3QoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRDaGFyKCkgewotCQlyZXR1cm4gKChDaGFyYWN0ZXIpIHRoaXMub2JqZWN0KS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyKGNoYXIgYykgewotCQl0aGlzLnNldE9iamVjdChDaGFyYWN0ZXIudmFsdWVPZihjKSk7Ci0JfQotCi0JcHVibGljIGJ5dGUgZ2V0Qnl0ZSgpIHsKLQkJcmV0dXJuICgoQnl0ZSkgdGhpcy5vYmplY3QpLmJ5dGVWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ5dGUoYnl0ZSBiKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KEJ5dGUudmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFNob3J0KCkgewotCQlyZXR1cm4gKChTaG9ydCkgdGhpcy5vYmplY3QpLnNob3J0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydChzaG9ydCBzKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KFNob3J0LnZhbHVlT2YocykpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50KCkgewotCQlyZXR1cm4gKChJbnRlZ2VyKSB0aGlzLm9iamVjdCkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnQoaW50IGkpIHsKLQkJdGhpcy5zZXRPYmplY3QoSW50ZWdlci52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMb25nKCkgewotCQlyZXR1cm4gKChMb25nKSB0aGlzLm9iamVjdCkubG9uZ1ZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9uZyhsb25nIGwpIHsKLQkJdGhpcy5zZXRPYmplY3QoTG9uZy52YWx1ZU9mKGwpKTsKLQl9Ci0KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoKSB7Ci0JCXJldHVybiAoKEZsb2F0KSB0aGlzLm9iamVjdCkuZmxvYXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsb2F0KGZsb2F0IGYpIHsKLQkJdGhpcy5zZXRPYmplY3QoRmxvYXQudmFsdWVPZihmKSk7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7Ci0JCXJldHVybiAoKERvdWJsZSkgdGhpcy5vYmplY3QpLmRvdWJsZVZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG91YmxlKGRvdWJsZSBkKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KERvdWJsZS52YWx1ZU9mKGQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE1YzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExpc3RDaG9vc2VyLkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFN1YmNsYXNzZXMgCi0gKiBjYW4gY2hhbmdlIHRoZSBkaWFsb2cncyB0aXRsZSwgbWVzc2FnZSwgYW5kL29yIGljb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0QnJvd3NlcgotCWltcGxlbWVudHMgTGlzdENob29zZXIuTGlzdEJyb3dzZXIgCi17Ci0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlTGlzdEJyb3dzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFByb21wdCB0aGUgdXNlciB1c2luZyBhIEpPcHRpb25QYW5lLgotCSAqLwotCXB1YmxpYyB2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBjaG9vc2VyKSB7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZygKLQkJCQljaG9vc2VyLCAKLQkJCQl0aGlzLm1lc3NhZ2UoY2hvb3NlciksIAotCQkJCXRoaXMudGl0bGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCQkpOwotCQkKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQljaG9vc2VyLmdldE1vZGVsKCkuc2V0U2VsZWN0ZWRJdGVtKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBtZXNzYWdlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgbWVzc2FnZVR5cGUoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFOwotCX0KLQkKLQlwcm90ZWN0ZWQgSWNvbiBpY29uKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdFtdIHNlbGVjdGlvblZhbHVlcyhKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvblZhbHVlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gY29tYm9Cb3guZ2V0TW9kZWwoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTY0OWJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi0vKioKLSAqIFRoaXMgcmVuZGVyZXIgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci0gKiBidXQgaXQgc2xpZ2h0bHkgcmVmYWN0b3JzIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaWNvbiBhbmQgdGV4dCBvZiB0aGUgbGlzdAotICogY2VsbCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGVhc2lseSBvdmVycmlkZSB0aGUgbWV0aG9kcyB0aGF0IGJ1aWxkCi0gKiB0aGUgaWNvbiBhbmQgdGV4dC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgeW91IG5lZWQgb25seSBvdmVycmlkZToKLSAqICAgICAjYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkKLSAqICAgICAjYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIKLQlleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyCi17Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCS8vIHN1YnN0aXR1dGUgbnVsbCBmb3IgdGhlIGNlbGwgdmFsdWUgc28gbm90aGluZyBpcyBkcmF3biBpbml0aWFsbHkuLi4KLQkJc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCBudWxsLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJdGhpcy5zZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJLy8gLi4udGhlbiBzZXQgdGhlIGljb24gYW5kIHRleHQgbWFudWFsbHkKLQkJdGhpcy5zZXRJY29uKHRoaXMuYnVpbGRJY29uKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCXRoaXMuc2V0VGV4dCh0aGlzLmJ1aWxkVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCXRoaXMuc2V0VG9vbFRpcFRleHQodGhpcy5idWlsZFRvb2xUaXBUZXh0KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0KLQkJLy8gdGhlIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IGlmIGEgcmVhZGVyIGlzIHJ1bm5pbmcKLQkJaWYgKHRoaXMuYWNjZXNzaWJsZUNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NpYmxlQ29udGV4dC5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSWNvbih2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpY29uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2VsbAotCSAqIHZhbHVlLiBUaGUgZGVmYXVsdCBpcyB0byBkaXNwbGF5IG5vIGljb24gYXQgYWxsIHVubGVzcyB0aGUKLQkgKiB2YWx1ZSBpdHNlbGYgaXMgYW4gaWNvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSWNvbiBidWlsZEljb24oT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIHJlcGxpY2F0ZSB0aGUgZGVmYXVsdCBiZWhhdmlvcgotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAoSWNvbikgdmFsdWUgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIHRvIGRpc3BsYXkgdGhlIG9iamVjdCdzIGRlZmF1bHQgc3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24gKGFzIHJldHVybmVkIGJ5ICN0b1N0cmluZygpKTsgdW5sZXNzIHRoZQotCSAqIHZhbHVlIGl0c2VsZiBpcyBhbiBpY29uLCBpbiB3aGljaCBjYXNlIG5vIHRleHQgaXMgZGlzcGxheWVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAiIiA6ICgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICogKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVG9vbFRpcFRleHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjY2Vzc2libGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyCi0JICogdGhlIGdpdmVuIHZhbHVlIGFuZCBvdGhlciBzZXR0aW5ncy4gKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEKLQkgKiBpbmhlcml0ZWQgZ2V0dGVyczogaGFzRm9jdXMsIGlzRW5hYmxlZCwgZXRjLikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBY2Nlc3NpYmxlTmFtZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3NpYmxlIG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlcgotCSAqIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Q1ZDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TcGlubmVyVGFibGVDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgc3Bpbm5lci4KLSAqLwotcHVibGljIGNsYXNzIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByb3RlY3RlZCBKU3Bpbm5lciBzcGlubmVyOwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0Ci0JICogc3Bpbm5lciBtb2RlbCwgd2hpY2ggaXMgYSAibnVtYmVyIiBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogc3Bpbm5lciBtb2RlbCwgd2hpY2ggd2lsbCBkZXRlcm1pbmUgaG93IHRoZSB2YWx1ZXMgYXJlIGRpc3BsYXllZC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKFNwaW5uZXJNb2RlbCBtb2RlbCkgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3Bpbm5lciA9IHRoaXMuYnVpbGRTcGlubmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpTcGlubmVyIGJ1aWxkU3Bpbm5lcigpIHsKLQkJSlNwaW5uZXIgcyA9IG5ldyBKU3Bpbm5lcigpOwotCQlzLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIHM7Ci0JfQotCQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCVNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lci5pbW1lZGlhdGVFZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXRoaXMuc3Bpbm5lci5zZXRDb21wb25lbnRPcmllbnRhdGlvbih0YWJsZS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpKTsKLQkJdGhpcy5zcGlubmVyLnNldEZvbnQodGFibGUuZ2V0Rm9udCgpKTsKLQkJdGhpcy5zcGlubmVyLnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCUpDb21wb25lbnQgZWRpdG9yID0gdGhpcy5lZGl0b3IoKTsKLQkJZWRpdG9yLnNldEZvcmVncm91bmQodGhpcy5mb3JlZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCWVkaXRvci5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQl0aGlzLnNwaW5uZXIuc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5zcGlubmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGZvcmVncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGZvcmVncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsRm9yZWdyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgYmFja2dyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxCYWNrZ3JvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBib3JkZXIuCi0JICovCi0JcHJvdGVjdGVkIEJvcmRlciBib3JkZXIoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IHJvdywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBjb2x1bW4pIHsKLQkJaWYgKGhhc0ZvY3VzKSB7Ci0JCQlyZXR1cm4gVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCXJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIodGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpLCAxKTsKLQkJfQotCQlyZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKHRhYmxlLmdldEJhY2tncm91bmQoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlZGl0b3IgY29tcG9uZW50IHdob3NlIGNvbG9ycyBzaG91bGQgYmUgc2V0Ci0JICogYnkgdGhlIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBKQ29tcG9uZW50IGVkaXRvcigpIHsKLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLnNwaW5uZXIuZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSB7Ci0JCQkvLyB0eXBpY2FsbHksIHRoZSBlZGl0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuLi4KLQkJCWVkaXRvciA9ICgoSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gSW50ZWdlci52YWx1ZU9mKDApOwotCQl9Ci0JCXRoaXMuc3Bpbm5lci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3Bpbm5lci5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIncyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChTcGlubmVyTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5zcGlubmVyLnNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSByb3cgaGVpZ2h0IHRvIHNvbWV0aGluZyB0aGUgc3Bpbm5lciB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLnNwaW5uZXIuZ2V0UHJlZmVycmVkU2l6ZSgpLmdldEhlaWdodCgpICsgMjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9UYWJsZUNlbGxFZGl0b3JBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTljODZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9UYWJsZUNlbGxFZGl0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0Q2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDZWxsRWRpdG9yOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbFJlbmRlcmVyOwotCi0vKioKLSAqIEEgdGFibGUgY2VsbCBlZGl0b3IgdGhhdCB3cmFwcyBhIHRhYmxlIGNlbGwgcmVuZGVyZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDZWxsRWRpdG9yIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yIHsKLQotCS8qKiBkZWxlZ2F0ZSB0byBhIHJlbmRlcmVyICovCi0JcHJpdmF0ZSBSZW5kZXJlciByZW5kZXJlcjsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIGVkaXRvciB0aGF0IGJlaGF2ZXMgbGlrZSB0aGUgc3BlY2lmaWVkIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5pbml0aWFsaXplKHJlbmRlcmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShSZW5kZXJlciByKSB7Ci0JCXRoaXMucmVuZGVyZXIgPSByOwotCQlyLnNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcih0aGlzLmJ1aWxkSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkpOwotCX0KLQkKLQlwcml2YXRlIEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBidWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbW1lZGlhdGVFZGl0KCkgewotCQkJCVRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIudGhpcy5zdG9wQ2VsbEVkaXRpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENlbGxFZGl0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxFZGl0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxFZGl0b3JDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgdHJ1ZSwgcm93LCBjb2x1bW4pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIE1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHJlbmRlcmVyCi0JICogdGhhdCBjYW4gYmUgd3JhcHBlZCBieSBhIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBSZW5kZXJlciBleHRlbmRzIFRhYmxlQ2VsbFJlbmRlcmVyIHsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlbmRlcmVyLgotCQkgKi8KLQkJT2JqZWN0IGdldFZhbHVlKCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBpbW1lZGlhdGUgZWRpdCBsaXN0ZW5lcgotCQkgKi8KLQkJdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoSW1tZWRpYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgewotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJlciBkb2VzIGFuICJpbW1lZGlhdGUgZWRpdCIKLQkJICovCi0JCXZvaWQgaW1tZWRpYXRlRWRpdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGU5NGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLS8qKgotICogVGhpcyBzeW5jaHJvbml6ZXIgd2lsbCBwZXJmb3JtIHN5bmNocm9uaXphdGlvbnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsCi0gKiBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9IHRvIHJldHVybiBpbW1lZGlhdGVseS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIHNob3VsZCBoYW5kbGUgYW55IGV4Y2VwdGlvbnMKLSAqIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5IHNvIHRoZSB0aHJlYWQKLSAqIGNhbiBjb250aW51ZSB0aGUgc3luY2hyb25pemF0aW9uIHByb2Nlc3MpLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBTeW5jaHJvbml6ZXIKLXsKLQkvKioKLQkgKiBUaGlzIGZsYWcgaXMgc2hhcmVkIHdpdGggdGhlIHN5bmNocm9uaXphdGlvbi9jb25zdW1lciB0aHJlYWQuIFNldHRpbmcgaXQgdG8gdHJ1ZQotCSAqIHdpbGwgdHJpZ2dlciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGJlZ2luIG9yLCBpZiB0aGUgc3luY2hyb25pemF0aW9uIGlzCi0JICogY3VycmVudGx5IGV4ZWN1dGluZywgdG8gZXhlY3V0ZSBhZ2Fpbiwgb25jZSB0aGUgY3VycmVudCBleGVjdXRpb24gaXMKLQkgKiBjb21wbGV0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNocm9uaXplRmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQotCS8qKgotCSAqIE1vc3Qgb2YgdGhlIHRocmVhZC1yZWxhdGVkIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjb25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBbGxvdyB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZAotCSAqIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcyhjb21tYW5kLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQsIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvciA9IG5ldyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKHRoaXMuYnVpbGRDb25zdW1lcihjb21tYW5kKSwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lciBidWlsZENvbnN1bWVyKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gbmV3IENvbnN1bWVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgYW5kIHN0YXJ0IHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkLCBidXQgcG9zdHBvbmUgdGhlIGZpcnN0Ci0JICogc3luY2hyb25pemF0aW9uIHVudGlsIHJlcXVlc3RlZCwgaS5lLiB2aWEgYSBjYWxsIHRvCi0JICoge0BsaW5rICNzeW5jaHJvbml6ZSgpfS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBXZSBkb24ndCBjbGVhciB0aGUgInN5bmNocm9uaXplIiBmbGFnIGhlcmU7IHNvIGlmIHRoZSBmbGFnIGhhcwotCSAqIGJlZW4gc2V0IDxlbT5iZWZvcmU8L2VtPiBnZXR0aW5nIGhlcmUsIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24gd2lsbAotCSAqIHN0YXJ0IHByb21wdGx5IChhbGJlaXQsIGFzeW5jaHJvbm91c2x5KS4KLQkgKiBUaGUgInN5bmNocm9uaXplIiBmbGFnIHdpbGwgYmUgc2V0IGlmOjx1bD4KLQkgKiA8bGk+e0BsaW5rICNzeW5jaHJvbml6ZSgpfSB3YXMgY2FsbGVkIGFmdGVyIHRoZSBzeW5jaHJvbml6ZXIgd2FzCi0JICogICAgIGNvbnN0cnVjdGVkIGJ1dCBiZWZvcmUge0BsaW5rICNzdGFydCgpfSB3YXMgY2FsbGVkOyBvcgotCSAqIDxsaT57QGxpbmsgI3N5bmNocm9uaXplKCl9IHdhcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQKLQkgKiAgICAgYnV0IGJlZm9yZSB7QGxpbmsgI3N0YXJ0KCl9IHdhcyBjYWxsZWQgKHRvIHJlc3RhcnQgdGhlIHN5bmNocm9uaXplcik7IG9yCi0JICogPGxpPntAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIGFuIG91dHN0YW5kaW5nIHJlcXVlc3QKLQkgKiAgICAgZm9yIGEgc3luY2hyb25pemF0aW9uIChpLmUuIHRoZSAic3luY2hyb25pemF0aW9uIiBmbGFnIHdhcyBzZXQgYXQKLQkgKiAgICAgdGhlIHRpbWUge0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQpCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSAic3luY2hyb25pemUiIGZsYWcgc28gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQgd2lsbCBlaXRoZXI8dWw+Ci0JICogPGxpPmlmIHRoZSB0aHJlYWQgaXMgcXVpZXNjZWQsIHN0YXJ0IGEgc3luY2hyb25pemF0aW9uIGltbWVkaWF0ZWx5LCBvcgotCSAqIDxsaT5pZiB0aGUgdGhyZWFkIGlzIGN1cnJlbnRseSBleGVjdXRpbmcgYSBzeW5jaHJvbml6YXRpb24sIGV4ZWN1dGUgYW5vdGhlcgotCSAqICAgICBzeW5jaHJvbml6YXRpb24gb25jZSB0aGUgY3VycmVudCBzeW5jaHJvbml6YXRpb24gaXMgY29tcGxldGUKLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQl0aGlzLnN5bmNocm9uaXplRmxhZy5zZXRUcnVlKCk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJydXB0IHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkIHNvIHRoYXQgaXQgc3RvcHMgZXhlY3V0aW5nIGF0IHRoZQotCSAqIGVuZCBvZiB0aGUgY3VycmVudCBzeW5jaHJvbml6YXRpb24uIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsCi0JICogdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQgaXMgZmluaXNoZWQgZXhlY3V0aW5nLiBJZiBhbnkgdW5jYXVnaHQKLQkgKiBleGNlcHRpb25zIHdlcmUgdGhyb3duIHdoaWxlIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0b3AoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3VtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcn0KLQkgKiB3aWxsIGV4ZWN1dGUgdGhlIGNsaWVudC1zdXBwbGllZCAic3luY2hyb25pemUiIGNvbW1hbmQuCi0JICogSXQgd2lsbCB3YWl0IHVudGlsIHRoZSBzaGFyZWQgInN5bmNocm9uaXplIiBmbGFnIGlzIHNldCB0byBleGVjdXRlIHRoZQotCSAqIGNvbW1hbmQuIE9uY2UgdGhlIGNvbWFuZCBpcyBleGVjdXRlZCwgdGhlIHRocmVhZCB3aWxsIHF1aWVzY2UgdW50aWwKLQkgKiB0aGUgZmxhZyBpcyBzZXQgYWdhaW4uIElmIHRoZSBmbGFnIHdhcyBzZXQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JICogY29tbWFuZCAoZWl0aGVyIHJlY3Vyc2l2ZWx5IGJ5IHRoZSBjb21tYW5kIGl0c2VsZiBvciBieSBhbm90aGVyIHRocmVhZCksCi0JICogdGhlIGNvbW1hbmQgd2lsbCBiZSByZS1leGVjdXRlZCBpbW1lZGlhdGVseS4gU3RvcCB0aGUgdGhyZWFkIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCgpfS4KLQkgKi8KLQljbGFzcyBDb25zdW1lcgotCQlpbXBsZW1lbnRzIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQgdGhhdCBleGVjdXRlcyBvbiB0aGUKLQkJICogc3luY2hyb25pemF0aW9uL2NvbnN1bWVyIHRocmVhZC4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0JCUNvbnN1bWVyKENvbW1hbmQgY29tbWFuZCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCX0KLQotCQkvKioKLQkJICogV2FpdCB1bnRpbCB0aGUgInN5bmNocm9uaXplIiBmbGFnIGlzIHNldCwKLQkJICogdGhlbiBjbGVhciBpdCBhbmQgYWxsb3cgdGhlICJzeW5jaHJvbml6ZSIgY29tbWFuZCB0byBleGVjdXRlLgotCQkgKi8KLQkJcHVibGljIHZvaWQgd2FpdEZvclByb2R1Y2VyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCUFzeW5jaHJvbm91c1N5bmNocm9uaXplci50aGlzLnN5bmNocm9uaXplRmxhZy53YWl0VG9TZXRGYWxzZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4ZWN1dGUgdGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kLgotCQkgKi8KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzBhMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotCi0vKioKLSAqIEV4dGVuZCB0aGUgYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSBvdXRzdGFuZGluZyAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7IHNpbmNlIG90aGVyLCB1bnJlbGF0ZWQsIHN5bmNocm9uaXphdGlvbnMgY2FuIGJlCi0gKiB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBMaXN0ZW5lcnMgc2hvdWxkIGhhbmRsZSBhbnkgZXhjZXB0aW9ucwotICogYXBwcm9wcmlhdGVseSAoZS5nLiBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGdyYWNlZnVsbHkgc28gdGhlIHRocmVhZAotICogY2FuIGNvbnRpbnVlIHRoZSBzeW5jaHJvbml6YXRpb24gcHJvY2VzcykuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWV4dGVuZHMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBDYWxsYmFja1N5bmNocm9uaXplcgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kIHRvIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykKLQkgKiB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQgdG8gcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykKLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoY29tbWFuZCwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBjb25zdW1lciB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgc3luY2hyb25pemF0aW9uIGhhcwotCSAqIHF1aWVzY2VkLgotCSAqLwotCUBPdmVycmlkZQotCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0NvbnN1bWVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6YXRpb25RdWllc2NlZCgpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5zeW5jaHJvbml6YXRpb25RdWllc2NlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6YXRpb24gdGhyZWFkIHJ1bm5hYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB7QGxpbmsgQXN5bmNocm9ub3VzU3luY2hyb25pemVyLkNvbnN1bWVyfQotCSAqIHRvIG5vdGlmeSB0aGUgc3luY2hyb25pemVyIHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgcXVpZXNjZWQKLQkgKiAoaS5lLiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgotCSAqIHJlcXVlc3RzIGZvciBzeW5jaHJvbml6YXRpb24pLgotCSAqIEJlY2F1c2Ugc3luY2hyb25pemF0aW9uIGlzIGFzeW5jaHJvbm91cywgbm8gb3RoZXIgdGhyZWFkIHdpbGwgYmUgYWJsZSB0bwotCSAqIGluaXRpYXRlIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHVudGlsIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgaGF2ZSBiZWVuCi0JICogbm90aWZpZWQuIE5vdGUgYWxzbywgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBjYW4sIHRoZW1zZWx2ZXMsCi0JICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCkpOwotCSAqIGJ1dCB0aGlzIHN5bmNocm9uaXphdGlvbiB3aWxsIG5vdCBvY2N1ciB1bnRpbCA8ZW0+YWZ0ZXI8L2VtPiBhbGwgdGhlCi0JICogbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZC4KLQkgKi8KLQljbGFzcyBDYWxsYmFja0NvbnN1bWVyCi0JCWV4dGVuZHMgQ29uc3VtZXIKLQl7Ci0JCUNhbGxiYWNrQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQlzdXBlcihjb21tYW5kKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJLy8gaG1tbSAtIHdlIHdpbGwgbm90aWZ5IGxpc3RlbmVycyBldmVuIHdoZW4gd2Ugb3VyIHRocmVhZCBpcyAiaW50ZXJydXB0ZWQiOwotCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgotCQkJaWYgKENhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLnRoaXMuc3luY2hyb25pemVGbGFnLmlzRmFsc2UoKSkgewotCQkJCUNhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLnRoaXMuc3luY2hyb25pemF0aW9uUXVpZXNjZWQoKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxYTA2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBTeW5jaHJvbml6ZXJ9IHRvIG5vdGlmeSBsaXN0ZW5lcnMKLSAqIHdoZW4gYSBzeW5jaHJvbml6YXRpb24gImN5Y2xlIiBpcyBjb21wbGV0ZTsgaS5lLiB0aGUgc3luY2hyb25pemF0aW9uIGhhcywKLSAqIGZvciB0aGUgbW9tZW50LCBxdWllc2NlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxsYmFja1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25pemVyCi17Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHN5bmNocm9uaXplciBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotCSAqIEBzZWUgI2FkZExpc3RlbmVyKExpc3RlbmVyKQotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlCi0JICogc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0JCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxMDE1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIHN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7Ci0gKiBzaW5jZSBvdGhlciwgdW5yZWxhdGVkLCBzeW5jaHJvbml6YXRpb25zIGNhbiBiZSB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiBhbm90aGVyIHN5bmNocm9uaXphdGlvbiBpcyBpbml0aWF0ZWQgd2hpbGUgd2UgYXJlCi0gKiBub3RpZnlpbmcgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyAoaS5lLiB0aGUgJ2FnYWluJyBmbGFnIGlzIHNldCksIGl0IHdpbGwgbm90Ci0gKiBzdGFydCB1bnRpbCBhbGwgdGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQuCi0gKiBOb3RlIGFsc28sIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgY2FuLCB0aGVtc2VsdmVzLAotICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKSk7Ci0gKiBidXQgdGhpcyBzeW5jaHJvbml6YXRpb24gd2lsbCBub3Qgb2NjdXIgdW50aWwgPGVtPmFmdGVyPC9lbT4gYWxsIHRoZQotICogbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZC4KLSAqLwotcHVibGljIGNsYXNzIENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlleHRlbmRzIFN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBDYWxsYmFja1N5bmNocm9uaXplcgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIHN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQgdG8gcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyBDYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcihjb21tYW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2FsbGJhY2tTeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6YXRpb25RdWllc2NlZCgpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5zeW5jaHJvbml6YXRpb25RdWllc2NlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQl2b2lkIGV4ZWN1dGVfKCkgewotCQlzdXBlci5leGVjdXRlXygpOwotCQlpZiAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpICE9IFN0YXRlLlJFUEVBVCkgewotCQkJLy8gaG1tbSAtIHdlIHdpbGwgbm90aWZ5IGxpc3RlbmVycyBldmVuIHdoZW4gd2UgYXJlICJzdG9wcGVkIjsKLQkJCS8vIHRoYXQgc2VlbXMgb2suLi4gIH5ianYKLQkJCXRoaXMuc3luY2hyb25pemF0aW9uUXVpZXNjZWQoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1YTQ1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIHByb3RvY29sIGZvciBzdGFydGluZywgc3RvcHBpbmcsIGFuZCBleGVjdXRpbmcgYQotICogbG9uZy1ydW5uaW5nLCByZXBlYXRhYmxlLCBhbmQgcG9zc2libHkgcmVjdXJzaXZlICJzeW5jaHJvbml6YXRpb24iIHByb2Nlc3MuCi0gKiBUaGUgaW50ZW50IGlzIGZvciB0aGUgc3luY2hyb25pemVyIHRvIHN5bmNocm9uaXplIGEgInNlY29uZGFyeSIgbW9kZWwgd2l0aAotICogYSAicHJpbWFyeSIgbW9kZWwuIEFueSBjaGFuZ2UgdG8gdGhlICJwcmltYXJ5IiBtb2RlbCB3aWxsIHRyaWdnZXIgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24uIFRoZSBzeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUKLSAqICJzZWNvbmRhcnkiIG1vZGVsIHJlbWFpbnMgaW4gc3luYyBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB7QGxpbmsgI3N0YXJ0KCl9IGFuZCB7QGxpbmsgI3N0b3AoKX0gbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gKiBhIHNpbmdsZSBtYXN0ZXIgdGhyZWFkIHRoYXQgd291bGQgY29udHJvbCB0aGUgc3luY2hyb25pemVyJ3MgbGlmZWN5Y2xlIGFuZAotICogdGhlIHtAbGluayAjc3luY2hyb25pemUoKX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSBmcm9tCi0gKiBtdWx0aXBsZSB0aHJlYWRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN5bmNocm9uaXplciB7Ci0KLQkvKioKLQkgKiBFbmFibGUgdGhlIHN5bmNocm9uaXplciB0byBhbGxvdyBmdXR1cmUgc3luY2hyb25pemF0aW9ucyBhcyByZXF1ZXN0ZWQKLQkgKiBieSBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqLwotCXZvaWQgc3RhcnQoKTsKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBkZXBlbmRlbnQgbW9kZWwgd2l0aCB0aGUgcHJpbWFyeSBtb2RlbC4gRG8gbm90aGluZyBpZgotCSAqIHtAbGluayAjc3RhcnQoKX0gaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLiBEbyBub3RoaW5nIGlmIHtAbGluayAjc3RvcH0KLQkgKiBoYXMgYmVlbiBjYWxsZWQgKHdpdGhvdXQgYW55IGludGVybWVkaWF0ZSBjYWxsIHRvIHtAbGluayAjc3RhcnQoKX0uCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZSgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgc3luY2hyb25pemVyIGltbWVkaWF0ZWx5IG9yLCBpZiBhIHN5bmNocm9uaXphdGlvbiBpcyBjdXJyZW50bHkKLQkgKiBpbiBwcm9ncmVzcywgd2hlbiBpdCBjb21wbGV0ZXMuIFJldHVybiB3aGVuIHRoZSBzeW5jaHJvbml6ZXIgaXMgc3RvcHBlZC4KLQkgKiBObyBmdXJ0aGVyIHN5bmNob25pemF0aW9ucyB3aWxsIHBlcmZvcm1lZCB1bnRpbCB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KLQkgKi8KLQl2b2lkIHN0b3AoKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU3luY2hyb25pemVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN5bmNocm9uaXplciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgU3luY2hyb25pemVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTeW5jaHJvbml6ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwYzYwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbXBvc2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRPYmplY3Q7Ci0KLS8qKgotICogVGhpcyBzeW5jaHJvbml6ZXIgd2lsbCBzeW5jaHJvbml6ZSBpbW1lZGlhdGVseSBhbmQgbm90IHJldHVybiB1bnRpbCB0aGUKLSAqIHN5bmNocm9uaXphdGlvbiBhbmQgYW55IG5lc3RlZCAocmVjdXJzaXZlKSBzeW5jaHJvbml6YXRpb25zIGFyZSBjb21wbGV0ZS4KLSAqIEluIHNvbWUgc2l0dWF0aW9ucyB0aGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSwgYW5kIGZvciBhcwotICogc2hvcnQgYSB0aW1lIGFzIHBvc3NpYmxlLCBhcyBpdCBpbmNyZWFzZXMgdGhlIHByb2JhYmlsaXR5IG9mIGRlYWRsb2Nrcy4gQQotICogZGVhZGxvY2sgY2FuIG9jY3VyIHdoZW4ge0BsaW5rIFN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSBpcyBjYWxsZWQgZnJvbSBtdWx0aXBsZQotICogdGhyZWFkcyBhbmQgbXVsdGlwbGUgcmVzb3VyY2VzIGFyZSBsb2NrZWQgYnkgdGhlIHN5bmNocm9uaXphdGlvbiBpbiB2YXJ5aW5nCi0gKiBvcmRlcnMuCi0gKiA8cD4KLSAqIEFzIGRlZmluZWQgaW4gdGhlIHtAbGluayBTeW5jaHJvbml6ZXJ9IGludGVyZmFjZSwge0BsaW5rIFN5bmNocm9uaXplciNzdGFydCgpfQotICogYW5kIHtAbGluayBTeW5jaHJvbml6ZXIjc3RvcCgpfQotICogc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgc2FtZSB0aHJlYWQsIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQuCi0gKiB7QGxpbmsgU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9IHNob3VsZAotICogYWx3YXlzIGJlIGNhbGxlZCBpbiB0aGUgc2FtZSB0aHJlYWQgKGkuZS4gb25seSByZWN1cnNpdmVseSwgYmV5b25kIHRoZQotICogaW5pdGlhbCBjYWxsKTsgYWx0aG91Z2gsIHRoaXMgdG9vIGlzIG5vdCByZXF1aXJlZC4KLSAqIFRoaXMgdGhyZWFkIG5lZWQgbm90IGJlIHRoZSBzYW1lIHRocmVhZCB0aGF0IGV4ZWN1dGVzCi0gKiB7QGxpbmsgU3luY2hyb25pemVyI3N0YXJ0KCl9IGFuZCB7QGxpbmsgU3luY2hyb25pemVyI3N0b3AoKX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWltcGxlbWVudHMgU3luY2hyb25pemVyCi17Ci0JLyoqCi0JICogVGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIHRoYXQgcGVyZm9ybXMgdGhlIHN5bmNocm9uaXphdGlvbi4gSXQgbWF5Ci0JICogdHJpZ2dlciBmdXJ0aGVyIGNhbGxzIHRvIHtAbGluayAjc3luY2hyb25pemUoKX0gKGkuZS4gdGhlCi0JICogc3luY2hyb25pemF0aW9uIG1heSByZWN1cnNlKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBzeW5jaHJvbml6ZXIncyBjdXJyZW50IHN0YXRlLgotCSAqLwotCWZpbmFsIFN5bmNocm9uaXplZE9iamVjdDxTdGF0ZT4gc3RhdGU7Ci0KLQkvKioKLQkgKiBUaGUgc3luY2hyb25pemVyJ3MgaW5pdGlhbCBzdGF0ZSBpcyB7QGxpbmsgI1NUT1BQRUR9LgotCSAqLwotCWVudW0gU3RhdGUgewotCQlTVE9QUEVELAotCQlSRUFEWSwKLQkJRVhFQ1VUSU5HLAotCQlSRVBFQVQsCi0JCVNUT1BQSU5HCi0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIHRoZSB1bmNhdWdodCBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlmaW5hbCBWZWN0b3I8VGhyb3dhYmxlPiBleGNlcHRpb25zID0gbmV3IFZlY3RvcjxUaHJvd2FibGU+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJLy8gdXNlIHRoZSBzeW5jaHJvbml6ZXIgYXMgdGhlIG11dGV4IHNvIGl0IGlzIGZyZWVkIHVwIGJ5IHRoZSB3YWl0IGluICNzdG9wKCkKLQkJdGhpcy5zdGF0ZSA9IG5ldyBTeW5jaHJvbml6ZWRPYmplY3Q8U3RhdGU+KFN0YXRlLlNUT1BQRUQsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzeW5jaHJvbml6ZXIncyB7QGxpbmsgI3N0YXRlfSB0byB7QGxpbmsgU3RhdGUjUkVBRFkgUkVBRFl9Ci0JICogYW5kIGV4ZWN1dGUgdGhlIGZpcnN0IHN5bmNocm9uaXphdGlvbi4gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZQotCSAqIHN5bmNocm9uaXplciBpcyBub3Qge0BsaW5rIFN0YXRlI1NUT1BQRUQgU1RPUFBFRH0uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuUkVBRFkpOwotCQkJCXRoaXMuc3luY2hyb25pemUoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVBRFk6Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCWNhc2UgUkVQRUFUOgotCQkJY2FzZSBTVE9QUElORzoKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQncyBwb3NzaWJsZSB0byBjb21lIGJhY2sgaGVyZSBpZiB0aGUgc3luY2hyb25pemF0aW9uIGNvbW1hbmQgcmVjdXJzZXMKLQkgKiBhbmQgdHJpZ2dlcnMgYW5vdGhlciBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCWlmICh0aGlzLmJlZ2luU3luY2hyb25pemF0aW9uKCkpIHsKLQkJCXRoaXMuc3luY2hyb25pemVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNsaWVudCBoYXMgcmVxdWVzdGVkIGEgc3luY2hyb25pemF0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHdlIGNhbiBiZWdpbiBhIG5ldyBzeW5jaHJvbml6YXRpb24uCi0JICogSWYgYSBzeW5jaHJvbml6YXRpb24gaXMgYWxyZWFkeSB1bmRlciB3YXksIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT47Ci0JICogYnV0IHNldCB0aGUge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFUEVBVCBSRVBFQVR9Ci0JICogc28gYW5vdGhlciBzeW5jaHJvbml6YXRpb24gd2lsbCBvY2N1ciBvbmNlIHRoZSBjdXJyZW50Ci0JICogc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gYmVnaW5TeW5jaHJvbml6YXRpb24oKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIFNUT1BQRUQ6Ci0JCQkJLy8gc3luY2hyb25pemF0aW9uIGlzIG5vdCBhbGxvd2VkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRUFEWToKLQkJCQkvLyBiZWdpbiBhIG5ldyBzeW5jaHJvbml6YXRpb24KLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLkVYRUNVVElORyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBzZXQgZmxhZyBzbyBhIG5ldyBzeW5jaHJvbml6YXRpb24gd2lsbCBvY2N1ciBvbmNlIHRoZSBjdXJyZW50IG9uZSBpcyBmaW5pc2hlZAotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuUkVQRUFUKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyB0aGUgInJlcGVhdCIgZmxhZyBpcyBhbHJlYWR5IHNldAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQkJLy8gbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIGFyZSBhbGxvd2VkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0IG9mICJyZWN1cnNpbmciCi0JICogc3luY2hyb25pemF0aW9ucy4gQW55IHJlY3Vyc2l2ZSBjYWxsIHRvIHtAbGluayAjc3luY2hyb25pemUoKX0gd2lsbAotCSAqIHNpbXBseSBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvIHtAbGluayBTdGF0ZSNSRVBFQVQgUkVQRUFUfSwKLQkgKiBjYXVzaW5nIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgYWdhaW4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplXygpIHsKLQkJZG8gewotCQkJdGhpcy5leGVjdXRlKCk7Ci0JCX0gd2hpbGUgKHRoaXMuZW5kU3luY2hyb25pemF0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kLiBEbyBub3QgYWxsb3cgYW55IHVuaGFuZGxlZAotCSAqIGV4Y2VwdGlvbnMgdG8ga2lsbCB0aGUgdGhyZWFkLiBTdG9yZSB0aGVtIHVwIGZvciBsYXRlciBwYWluLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJdGhpcy5leGVjdXRlXygpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXRoaXMuZXhjZXB0aW9ucy5hZGQoZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwganVzdCBleGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgc3luY2hyb25pemF0aW9uIGhhcyBmaW5pc2hlZC4KLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgYmVnaW4gYW5vdGhlciBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlbmRTeW5jaHJvbml6YXRpb24oKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIFNUT1BQRUQ6Ci0JCQljYXNlIFJFQURZOgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWNhc2UgRVhFQ1VUSU5HOgotCQkJCS8vIHN5bmNocm9uaXphdGlvbiBoYXMgZmluaXNoZWQgYW5kIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgYW5vdGhlcjsgcmV0dXJuIHRvICJyZWFkeSIKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyB0aGUgInJlcGVhdCIgZmxhZyB3YXMgc2V0OyBjbGVhciBpdCBhbmQgc3RhcnQgYW5vdGhlciBzeW5jaHJvbml6YXRpb24KLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLkVYRUNVVElORyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCS8vIGEgY2xpZW50IGhhcyBpbml0aWF0ZWQgYSAic3RvcCI7IG1hcmsgdGhlICJzdG9wIiBjb21wbGV0ZSBhbmQgcGVyZm9ybSBubyBtb3JlIHN5bmNocm9uaXphdGlvbnMKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlNUT1BQRUQpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBmbGFncyBzbyB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgc3luY2hyb25pemF0aW9uIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIFNUT1BQRUQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJY2FzZSBSRUFEWToKLQkJCQkvLyBzaW1wbHkgcmV0dXJuIHRvICJzdG9wcGVkIiBzdGF0ZQotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuU1RPUFBFRCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCWNhc2UgUkVQRUFUOgotCQkJCS8vIHNldCB0aGUgInN0b3BwaW5nIiBmbGFnIGFuZCB3YWl0IHVudGlsIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIGZpbmlzaGVkCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5TVE9QUElORyk7Ci0JCQkJdGhpcy53YWl0VW50aWxTdG9wcGVkKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJaWYgKHRoaXMuZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlUaHJvd2FibGVbXSB0ZW1wID0gdGhpcy5leGNlcHRpb25zLnRvQXJyYXkobmV3IFRocm93YWJsZVt0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpXSk7Ci0JCQl0aGlzLmV4Y2VwdGlvbnMuY2xlYXIoKTsKLQkJCXRocm93IG5ldyBDb21wb3NpdGVFeGNlcHRpb24odGVtcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdhaXQgd2lsbCBmcmVlIHVwIHRoZSBzeW5jaHJvbml6ZXIncyBzeW5jaHJvbml6ZWQgbWV0aG9kcwotCSAqIChzaW5jZSB0aGUgc3luY2hyb25pemVyIGlzIHRoZSBzdGF0ZSdzIG11dGV4KS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsU3RvcHBlZCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3RhdGUud2FpdFVudGlsVmFsdWVJcyhTdGF0ZS5TVE9QUEVEKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQgI3N0b3AoKSB3YXMgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZwotCQkJLy8gZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gdG8gZmluaXNoIC0gaWdub3JlOwotCQkJLy8gJ3N0YXRlJyBpcyBzdGlsbCBzZXQgdG8gJ1NUT1BQSU5HJywgc28gdGhlICNzeW5jaHJvbml6ZV8oKSBsb29wCi0JCQkvLyB3aWxsIHN0aWxsIHN0b3AgLSB3ZSBqdXN0IHdvbid0IHdhaXQgYXJvdW5kIGZvciBpdC4uLgotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzdGF0ZTogIiArIHRoaXMuc3RhdGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGF0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI1MzJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vZGVscyB0aGF0IG5vdGlmeSBsaXN0ZW5lcnMgb2YKLSAqIGNoYW5nZXMgdG8gYm91bmQgcHJvcGVydGllcywgY29sbGVjdGlvbnMsIGxpc3RzLCBhbmQvb3IgdHJlZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIENoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIFN0YXRlQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgTGlzdENoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIFRyZWVDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsCi0gKi8KLS8vIFRPRE8gdXNlIG9iamVjdHMgKElEcz8pIGluc3RlYWQgb2Ygc3RyaW5ncyB0byBpZGVudGlmeSBhc3BlY3RzPwotcHVibGljIGludGVyZmFjZSBNb2RlbCB7Ci0KLQkvLyAqKioqKioqKioqIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNoYW5nZSBldmVudHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBzdGF0ZSBjaGFuZ2UgZXZlbnRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHByb3BlcnR5IGNoYW5nZSBldmVudHMsCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGxpc3QgbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHRyZWUgbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCB0cmVlIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBhOWI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgYWxsIHRoZSBjaGFuZ2UgZXZlbnRzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IG1vZGVscy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RlbCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiAoTW9kZWwpIHN1cGVyLmdldFNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJaWYgKHNiLmxlbmd0aCgpID09IGxlbikgewotCQkJc2IuZGVsZXRlQ2hhckF0KGxlbiAtIDEpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJLy8gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBkbyBzb21ldGhpbmcgYSBiaXQgbW9yZSBoZWxwZnVsCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkFkZEV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkFkZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjgxNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gYWRkIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGFkZHMgaXRlbXMgdG8gYQotICogImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvbkFkZEV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qIAotICogRGVzaWduIG9wdGlvbnM6Ci0gKiAtIGNyZWF0ZSBhIGNvbGxlY3Rpb24gdG8gd3JhcCBhIHNpbmdsZSBhZGRlZCBvciByZW1vdmVkIGl0ZW0KLSAqIAkodGhpcyBpcyB0aGUgb3B0aW9uIHdlIGltcGxlbWVudGVkIGJlbG93IGFuZCBpbiBjb2xsYWJvcmF0aW5nIGNvZGUpCi0gKiAJc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIG9wdGltaXplIGRvd25zdHJlYW0gY29kZSBmb3IKLSAqIAlzaW5nbGUgaXRlbXMsIHdlIHRha2UgYW5vdGhlciBwZXJmb3JtYW5jZSBoaXQgYnkgYnVpbGRpbmcKLSAqIAlhIGNvbGxlY3Rpb24gZWFjaCB0aW1lICAoQHNlZSBDb2xsZWN0aW9ucyNzaW5nbGV0b24oT2JqZWN0KSkKLSAqIAlhbmQgZm9yY2luZyBkb3duc3RyZWFtIGNvZGUgdG8gdXNlIGFuIGl0ZXJhdG9yIGV2ZXJ5IHRpbWUKLSAqIAotICogLSBmaXJlIGEgc2VwYXJhdGUgZXZlbnQgZm9yIGVhY2ggaXRlbSBhZGRlZCBvciByZW1vdmVkCi0gKiAJZWxpbWluYXRlcyBhbnkgcG90ZW50aWFsIGZvciBvcHRpbWl6YXRpb25zIHRvIGRvd25zdHJlYW0gY29kZQotICogCi0gKiAtIGFkZCBwcm90b2NvbCB0byBzdXBwb3J0IGJvdGggc2luZ2xlIGl0ZW1zIGFuZCBjb2xsZWN0aW9ucwotICogCWFkZHMgY29uZGl0aW9uYWwgbG9naWMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uQWRkRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JLyoqIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGl0ZW1zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgaXRlbSkgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBpdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdpdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5pdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludCBnZXRJdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5pdGVtcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25BZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25BZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25BZGRFdmVudChuZXdTb3VyY2UsIG5ld0NvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyZjRlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbiBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIGNvbGxlY3Rpb24gZXZlbnRzLgotICogQSA8Y29kZT5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIEEgPGNvZGU+Q29sbGVjdGlvbkNoYW5nZUV2ZW50PC9jb2RlPiBpcyBhY2NvbXBhbmllZCBieSB0aGUgY29sbGVjdGlvbiBuYW1lIGFuZAotICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JLyoqCi0JICogVGhlIHRoZSBjb2xsZWN0aW9uIGluIGl0cyBjdXJyZW50IHN0YXRlLgotCSAqIENsaWVudHMgd2lsbCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gc3luY2hyb25pemUKLQkgKiB3aXRoIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gY29sbGVjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbi50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdjb2xsZWN0aW9uJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdFtdIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbGxlY3Rpb25TaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2xlYXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTgyNjM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2xlYXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25DbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBleHRlbmRzIENvbGxlY3Rpb25FdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzkzYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotLy8gVE9ETyBhZGQgIml0ZW0vb3JpZ2luYWwvbmVzdGVkIGV2ZW50IiBmb3IgaXRlbSBjaGFuZ2VkPwotLyoqCi0gKiBBICJjb2xsZWN0aW9uIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvbkV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGUgaW50ZW50IGlzIHRoYXQgYW55IGxpc3RlbmVyCi0gKiBjYW4ga2VlcCBpdHNlbGYgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgY29sbGVjdGlvbiB2aWEgdGhlIGNvbGxlY3Rpb24KLSAqIGV2ZW50cyBpdCByZWNlaXZlcyBhbmQgbmVlZCBub3QgbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsCi0gKiBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCi0JLyoqIE5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLiAqLwotCWZpbmFsIFN0cmluZyBjb2xsZWN0aW9uTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb25OYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25SZW1vdmVFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25SZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQ4NzdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uUmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIHJlbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCByZW1vdmVzIGl0ZW1zCi0gKiBmcm9tIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvblJlbW92ZUV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JLyoqIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBpdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdpdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RBZGRFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM2YzRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGl0ZW1zIHRvIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RBZGRFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vKgotICogU2VlIGRlc2lnbiBkaXNjdXNzaW9uIGluIENvbGxlY3Rpb25BZGRFdmVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdEFkZEV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKiBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0KLQkvKiogVGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBsaXN0LiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gaXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXcgT2JqZWN0W10ge2l0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4KLQkgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBpdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdpdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgTGlzdEFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMuaXRlbXMgPSBpdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5pdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5pdGVtcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbmV3IExpc3RBZGRFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmluZGV4ICsgb2Zmc2V0LCB0aGlzLml0ZW1zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjYmI5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgbGlzdCBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIGxpc3QgZXZlbnRzLgotICogQSA8Y29kZT5MaXN0Q2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIEEgPGNvZGU+TGlzdENoYW5nZUV2ZW50PC9jb2RlPiBpcyBhY2NvbXBhbmllZCBieSB0aGUgbGlzdCBuYW1lIGFuZAotICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q2hhbmdlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqCi0JICogVGhlIHRoZSBsaXN0IGluIGl0cyBjdXJyZW50IHN0YXRlLgotCSAqIENsaWVudHMgd2lsbCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gc3luY2hyb25pemUKLQkgKiB3aXRoIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gbGlzdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgbGlzdC50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdsaXN0JyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIE9iamVjdFtdIGxpc3QpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0TGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5saXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpc3RTaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMubGlzdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2xlYXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGMzMmYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2xlYXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RDbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q2xlYXJFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBjbGVhciBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdENsZWFyRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2xlYXJFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0RXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzZDM4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8vIFRPRE8gYWRkICJpdGVtL29yaWdpbmFsL25lc3RlZCBldmVudCIgZm9yIGl0ZW0gY2hhbmdlZD8KLS8qKgotICogQSAibGlzdCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogVGhlIGludGVudCBpcyB0aGF0IGFueSBsaXN0ZW5lcgotICogY2FuIGtlZXAgaXRzZWxmIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIGxpc3QgdmlhIHRoZSBsaXN0Ci0gKiBldmVudHMgaXQgcmVjZWl2ZXMgYW5kIG5lZWQgbm90IG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbAotICogbGlzdC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgbGlzdE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAobGlzdE5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5saXN0TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdE1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGU1YzdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBtb3ZlcyB0aGUgZWxlbWVudHMgaW4KLSAqIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdE1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdE1vdmVFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQkvKiogVGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IHRhcmdldEluZGV4OwotCi0JLyoqIFRoZSBpbmRleCBmcm9tIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IHNvdXJjZUluZGV4OwotCi0JLyoqIFRoZSBudW1iZXIgb2YgaXRlbXMgbW92ZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gdGFyZ2V0SW5kZXggVGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqIEBwYXJhbSBzb3VyY2VJbmRleCBUaGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaXRlbXMgbW92ZWQuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLnRhcmdldEluZGV4ID0gdGFyZ2V0SW5kZXg7Ci0JCXRoaXMuc291cmNlSW5kZXggPSBzb3VyY2VJbmRleDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICovCi0JcHVibGljIGludCBnZXRUYXJnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmcm9tIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U291cmNlSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZUluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5zb3VyY2VJbmRleCk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLnRhcmdldEluZGV4KTsKLQkJc2IuYXBwZW5kKCIgbGVuZ3RoPSIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbmV3IExpc3RNb3ZlRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy50YXJnZXRJbmRleCArIG9mZnNldCwgdGhpcy5zb3VyY2VJbmRleCArIG9mZnNldCwgdGhpcy5sZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZW1vdmVFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY2OTY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IHJlbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCByZW1vdmVzIGl0ZW1zCi0gKiBmcm9tIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdFJlbW92ZUV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0UmVtb3ZlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JLyoqIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0UmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdFJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZXBsYWNlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVwbGFjZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmFhNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZXBsYWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IHJlcGxhY2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVwbGFjZXMgaXRlbXMgaW4gYQotICogImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdFJlcGxhY2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdFJlcGxhY2VFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQkvKiogVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlcGxhY2VkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JLyoqIFRoZSBuZXcgaXRlbXMgdGhhdCByZXBsYWNlZCB0aGUgb2xkIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gbmV3SXRlbXM7Ci0KLQkvKiogVGhlIG9sZCBpdGVtcyB0aGF0IHdlcmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIG9sZEl0ZW1zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlcGxhY2UgZXZlbnQgZm9yIGEgbGlzdCBvZiByZXBsYWNlZCBpdGVtcy4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtIGluIHRoZSBsaXN0IHdhcyByZXBsYWNlZC4KLQkgKiBAcGFyYW0gbmV3SXRlbSBUaGUgbmV3IGl0ZW0gaW4gdGhlIGxpc3QuCi0JICogQHBhcmFtIG9sZEl0ZW0gVGhlIG9sZCBpdGVtIGluIHRoZSBsaXN0IHRoYXQgd2VyZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IG9sZEl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3IE9iamVjdFtdIHtuZXdJdGVtfSwgbmV3IE9iamVjdFtdIHtvbGRJdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgcmVwbGFjZSBldmVudCBmb3IgYSBsaXN0IG9mIHJlcGxhY2VkIGl0ZW1zLgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIGluIHRoZSBsaXN0IHdlcmUgcmVwbGFjZWQuCi0JICogQHBhcmFtIG5ld0l0ZW1zIFRoZSBuZXcgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICogQHBhcmFtIG9sZEl0ZW1zIFRoZSBvbGQgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gb2xkSXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMudG9BcnJheSgpLCBvbGRJdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmIGVpdGhlciAnbmV3SXRlbXMnIG9yICdvbGRJdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgTGlzdFJlcGxhY2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3RbXSBuZXdJdGVtcywgT2JqZWN0W10gb2xkSXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCWlmIChuZXdJdGVtcy5sZW5ndGggIT0gb2xkSXRlbXMubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzaXplcyBtdXN0IG1hdGNoIC0gbmV3IGl0ZW1zIHNpemU6ICIgKyBuZXdJdGVtcy5sZW5ndGggLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgb2xkIGl0ZW1zIHNpemU6ICIgKyBvbGRJdGVtcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl0aGlzLm5ld0l0ZW1zID0gbmV3SXRlbXM7Ci0JCXRoaXMub2xkSXRlbXMgPSBvbGRJdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5ldyBpdGVtcyB0aGF0IHJlcGxhY2VkIHRoZSBvbGQgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldE5ld0l0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLm5ld0l0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9sZCBpdGVtcyB0aGF0IHdlcmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0T2xkSXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMub2xkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2VyZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmV3SXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLm9sZEl0ZW1zKTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLm5ld0l0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lIGFuZCBkaXNwbGFjaW5nCi0JICogdGhlIGluZGV4IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdFJlcGxhY2VFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmluZGV4ICsgb2Zmc2V0LCB0aGlzLm5ld0l0ZW1zLCB0aGlzLm9sZEl0ZW1zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg2OTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBwcm9wZXJ0eS4gQSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9LgotICogQSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBhY2NvbXBhbmllZCBieSB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzCi0gKiBvZiB0aGUgcHJvcGVydHkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCi0JLyoqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4gKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0KLQkvKiogVGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLCBiZWZvcmUgdGhlIGNoYW5nZS4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQotCS8qKiBUaGUgcHJvcGVydHkncyBuZXcgdmFsdWUsIGFmdGVyIHRoZSBjaGFuZ2UuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5vbGRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmV3VmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5wcm9wZXJ0eU5hbWUpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMub2xkVmFsdWUpOwotCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChuZXdTb3VyY2UsIHRoaXMucHJvcGVydHlOYW1lLCB0aGlzLm9sZFZhbHVlLCB0aGlzLm5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBwcm9wZXJ0eSBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdQcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3UHJvcGVydHlOYW1lLCB0aGlzLm9sZFZhbHVlLCB0aGlzLm5ld1ZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9TdGF0ZUNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE1NGRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9TdGF0ZUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSBnZW5lcmljICJzdGF0ZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyB0bwotICogc3VjaCBleHRlbnQgdGhhdCBpdCBjYW5ub3QgYmUgZGVsaW5lYXRlZCBhbGwgYXNwZWN0cyBvZiBpdCB0aGF0IGhhdmUgY2hhbmdlZC4KLSAqIEFueSBsaXN0ZW5lciBjYW4gc3luY2hyb25pemUgd2l0aCB0aGUgbW9kZWwgYXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBtb2RlbCBpcwotICogYXZhaWxhYmxlIGFzIHRoZSBldmVudCdzICdzb3VyY2UnLgotICogQSA8Y29kZT5TdGF0ZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IHRvIHRoZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGVDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIFN0YXRlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFN0YXRlQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VFdmVudChuZXdTb3VyY2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQxODIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgYWRkIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGFkZHMgYSBub2RlIHRvIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUFkZEV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotCS8qKgotICAgICAqIFBhdGggdG8gdGhlIG5vZGUgYWRkZWQgdG8gdGhlIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIHBhdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGFkZGVkLgotCSAqLwotCXB1YmxpYyBUcmVlQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIHBhdGgudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAncGF0aCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgVHJlZUFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMucGF0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFRyZWVBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCB0cmVlIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0cmVlIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVBZGRFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDaGFuZ2VFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI5YThmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIHRyZWUgaW4gYSBtYW5uZXIgdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkKLSAqIHRoZSBvdGhlciB0cmVlIGV2ZW50cy4KLSAqIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbm9kZXMgaW4gdGhlIGNoYW5nZWQgdHJlZS4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gbm9kZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIG5vZGVzIFRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgQ29sbGVjdGlvbjw/PiBub2RlcykgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ25vZGVzJyBpcyBudWxsCi0JfQotCQotCXByaXZhdGUgVHJlZUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBub2RlcykgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQkJdGhpcy5ub2RlcyA9IG5vZGVzOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldE5vZGVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLm5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbm9kZXMgaW4gdGhlIGNoYW5nZWQgdHJlZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgdHJlZSBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgdHJlZSBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3VHJlZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlRXZlbnQobmV3U291cmNlLCBuZXdUcmVlTmFtZSwgdGhpcy5ub2Rlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2xlYXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzgwZGJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2xlYXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVlQ2xlYXJFdmVudCBleHRlbmRzIFRyZWVFdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFRyZWVDbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNsZWFyRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTc2MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgdHJlZS4gQSA8Y29kZT5UcmVlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyfS4KLSAqIFRoZSBpbnRlbnQgaXMgdGhhdCBhbnkgbGlzdGVuZXIKLSAqIGNhbiBrZWVwIGl0c2VsZiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwncyB0cmVlIHZpYSB0aGUgdHJlZSBldmVudHMKLSAqIGl0IHJlY2VpdmVzIGFuZCBuZWVkIG5vdCBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdHJlZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSB0cmVlIHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgdHJlZU5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFRyZWVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAodHJlZU5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmVlTmFtZSA9IHRyZWVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRyZWVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy50cmVlTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlUmVtb3ZlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlUmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0ZGExNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZVJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIHJlbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCByZW1vdmVzIGEgbm9kZSByb20gYQotICogImJvdW5kIiBvciAiY29uc3RyYWluZWQiIHRyZWUuIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVlUmVtb3ZlRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0JLyoqCi0gICAgICogUGF0aCB0byB0aGUgbm9kZSByZW1vdmVkIGZyb20gdGhlIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIHBhdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIFRyZWVSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMoc291cmNlLCB0cmVlTmFtZSwgcGF0aC50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdwYXRoJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBUcmVlUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJc3VwZXIoc291cmNlLCB0cmVlTmFtZSk7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRQYXRoKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLnBhdGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBUcmVlUmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgdHJlZSBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgdHJlZSBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlUmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3VHJlZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBUcmVlUmVtb3ZlRXZlbnQobmV3U291cmNlLCBuZXdUcmVlTmFtZSwgdGhpcy5wYXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzA2MGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvLyAqKioqKiBzdGF0ZQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBwcm9wZXJ0eQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBjb2xsZWN0aW9uCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqIGxpc3QKLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqIHRyZWUKLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNThlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLS8qKgotICogR2VuZXJhbCBwdXJwb3NlIGNoYW5nZSBsaXN0ZW5lci4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlTGlzdGVuZXIKLQlleHRlbmRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciwgTGlzdENoYW5nZUxpc3RlbmVyLCBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQkvLyBjb21iaW5lIHRoZSBvdGhlciBsaXN0ZW5lciBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjc1YjkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhiNWM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIGNvbGxlY3Rpb24uIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdG8gYSBib3VuZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBhIGJvdW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGNvbGxlY3Rpb24gaXMgY2hhbmdlZCBpbiBhIG1hbm5lcgotCSAqIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5IHRoZSBvdGhlciBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db21tYW5kQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db21tYW5kQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkYTM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29tbWFuZENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ2hhbmdlTGlzdGVuZXJ9LgotICogQWxsIGNoYW5nZSBub3RpZmljYXRpb25zIGFyZSBmdW5uZWxlZCB0aHJvdWdoIGEgc2luZ2xlIGNvbW1hbmQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kQ2hhbmdlTGlzdGVuZXIKLQlleHRlbmRzIFNpbXBsZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoYW5nZSBsaXN0ZW5lciB0aGF0IGV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aGVuZXZlcgotCSAqIGl0IHJlY2VpdmVzIGFueSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZyb20gdGhlIG1vZGVsIHRvIHdoaWNoIGl0IGlzIGFkZGVkCi0JICogYXMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZENoYW5nZUxpc3RlbmVyKENvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZCgpIHsKLQkJdGhpcy5jb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjg2ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzODczZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci0KLS8qKgotICogQSAibGlzdCBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogbGlzdC4gWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPkxpc3RDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIGxpc3QgdXBkYXRlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdENoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSBhZGRlZCB0byBhIGJvdW5kIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQsIGFuZCB0aGUgaW5kZXgKLQkgKiBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBhIGJvdW5kIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUgcmVtb3ZlZCwgYW5kIHRoZSBpbmRleAotCSAqIGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgaW4gYSBib3VuZCBsaXN0IGFyZSByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZQotCSAqIHJlcGxhY2VkLCBhbmQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgaW4gYSBib3VuZCBsaXN0IGFyZSBtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBpbmRpY2VzIG9mIHdoZXJlIGl0ZW1zIHdlcmUgbW92ZWQKLQkgKiBmcm9tIGFuZCB0by4KLQkgKi8KLQl2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgbGlzdCBpcyBjbGVhcmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDbGVhckV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBsaXN0IGlzIGNoYW5nZWQgaW4gYSBtYW5uZXIKLQkgKiB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2hhbmdlRXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL011bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2MjgwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXJ9IHdoZW4gdGhlIHJlcXVlc3RlZCBsaXN0ZW5lcgotICogbmVlZHMgdG8gaW1wbGVtZW50IG11bHRpcGxlIG1ldGhvZHMgKGkuZS4ge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0sCi0gKiB7QGxpbmsgTGlzdENoYW5nZUxpc3RlbmVyfSwgb3Ige0BsaW5rIFRyZWVDaGFuZ2VMaXN0ZW5lcn0pLgotICovCi1jbGFzcyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyIAotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCS8qKiB0aGUgbWV0aG9kcyB3ZSB3aWxsIGludm9rZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGFkZE1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCByZW1vdmVNZXRob2Q7Ci0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgcmVwbGFjZU1ldGhvZDsJLy8gdGhpcyBjYW4gYmUgbnVsbAotCXByaXZhdGUgZmluYWwgTWV0aG9kIG1vdmVNZXRob2Q7CS8vIHRoaXMgY2FuIGJlIG51bGwKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBjbGVhck1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBjaGFuZ2VNZXRob2Q7Ci0KLQotCS8qKgotCSAqIFRoZSAicmVwbGFjZSIgYW5kICJtb3ZlIiBtZXRob2RzIGFyZSBvcHRpb25hbC4KLQkgKi8KLQlNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgcmVwbGFjZU1ldGhvZCwgTWV0aG9kIG1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmFkZE1ldGhvZCA9IGFkZE1ldGhvZDsKLQkJdGhpcy5yZW1vdmVNZXRob2QgPSByZW1vdmVNZXRob2Q7Ci0JCXRoaXMucmVwbGFjZU1ldGhvZCA9IHJlcGxhY2VNZXRob2Q7Ci0JCXRoaXMubW92ZU1ldGhvZCA9IG1vdmVNZXRob2Q7Ci0JCXRoaXMuY2xlYXJNZXRob2QgPSBjbGVhck1ldGhvZDsKLQkJdGhpcy5jaGFuZ2VNZXRob2QgPSBjaGFuZ2VNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogTm8gInJlcGxhY2UiIG9yICJtb3ZlIiBtZXRob2RzLgotCSAqLwotCU11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQl0aGlzKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIG51bGwsIG51bGwsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBDb2xsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgQ29sbGVjdGlvbkV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmFkZE1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNsZWFyTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2hhbmdlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIExpc3RFdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBMaXN0RXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuYWRkTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlbW92ZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlcGxhY2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5tb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBUcmVlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgVHJlZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuYWRkTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBiZGY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfS4KLSAqIFRoaXMgaXMgcHJvYmFibHkgb2YgbGltaXRlZCB1c2UsIHNpbmNlIHRoZXJlIG9ubHkgYSBzaW5nbGUgbWV0aG9kIHRvIGltcGxlbWVudDsKLSAqIG1heWJlIGFzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWQ0MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSAicHJvcGVydHkgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIHByb3BlcnR5LiBZb3UgY2FuIHJlZ2lzdGVyIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIHByb3BlcnR5IHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBtb2RlbCBoYXMgY2hhbmdlZCBhIGJvdW5kIHByb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UKLQkgKiBhbmQgdGhlIHByb3BlcnR5J3Mgb2xkIGFuZCBuZXcgdmFsdWVzLgotCSAqLwotCXZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YzM2MmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGJ1aWxkcyBsaXN0ZW5lcnMgdGhhdCByZWZsZWN0aXZlbHkgZm9yd2FyZCBjaGFuZ2UgZXZlbnRzLgotICogSWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IGhhdmluZyB0b28gbWFueSBsaXR0bGUgY2xhc3NlcyB0aGF0IGhhdmUgdG8gYmUKLSAqIGxvYWRlZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgY2xhc3MgbG9hZGVyLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlc2UuCi0gKiBPZiBjb3Vyc2UsIHRoaXMgY29tZXMgd2l0aCB0aGUgYWRkaXRpb25hbCBvdmVyaGVhZCBvZiByZWZsZWN0aW9uLi4uLgotICogQWxzbyBub3RlIHRoYXQgdGhlIHZhbGlkaXR5IG9mIHRoZSBtZXRob2QgbmFtZSBpcyBub3QgY2hlY2tlZCBhdCBjb21waWxlCi0gKiB0aW1lLCBidXQgYXQgcnVudGltZTsgYWx0aG91Z2ggd2UgPGVtPmRvPC9lbT4gY2hlY2sgdGhlIG1ldGhvZCBhcyBzb29uIGFzIHRoZQotICogbGlzdGVuZXIgaXMgaW5zdGFudGlhdGVkLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKiB0aGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB3ZSB3aWxsIGludm9rZSB0aGUgbWV0aG9kICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCB0YXJnZXQ7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VFdmVudD4gU1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTID0gU3RhdGVDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFN0YXRlQ2hhbmdlRXZlbnQ+W10gU1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1NUQVRFX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VFdmVudD4gUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTID0gUHJvcGVydHlDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFByb3BlcnR5Q2hhbmdlRXZlbnQ+W10gUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1BST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkV2ZW50PiBDT0xMRUNUSU9OX0VWRU5UX0NMQVNTID0gQ29sbGVjdGlvbkV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkV2ZW50PltdIENPTExFQ1RJT05fRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25BZGRFdmVudD4gQ09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uQWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQWRkRXZlbnQ+W10gQ09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uUmVtb3ZlRXZlbnQ+IENPTExFQ1RJT05fUkVNT1ZFX0VWRU5UX0NMQVNTID0gQ29sbGVjdGlvblJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvblJlbW92ZUV2ZW50PltdIENPTExFQ1RJT05fUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0NPTExFQ1RJT05fUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNsZWFyRXZlbnQ+IENPTExFQ1RJT05fQ0xFQVJfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uQ2xlYXJFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DbGVhckV2ZW50PltdIENPTExFQ1RJT05fQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VFdmVudD4gQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlRXZlbnQ+W10gQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RFdmVudD4gTElTVF9FVkVOVF9DTEFTUyA9IExpc3RFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RFdmVudD5bXSBMSVNUX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0QWRkRXZlbnQ+IExJU1RfQUREX0VWRU5UX0NMQVNTID0gTGlzdEFkZEV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEFkZEV2ZW50PltdIExJU1RfQUREX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfQUREX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlbW92ZUV2ZW50PiBMSVNUX1JFTU9WRV9FVkVOVF9DTEFTUyA9IExpc3RSZW1vdmVFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RSZW1vdmVFdmVudD5bXSBMSVNUX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX1JFTU9WRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RSZXBsYWNlRXZlbnQ+IExJU1RfUkVQTEFDRV9FVkVOVF9DTEFTUyA9IExpc3RSZXBsYWNlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0UmVwbGFjZUV2ZW50PltdIExJU1RfUkVQTEFDRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX1JFUExBQ0VfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0TW92ZUV2ZW50PiBMSVNUX01PVkVfRVZFTlRfQ0xBU1MgPSBMaXN0TW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdE1vdmVFdmVudD5bXSBMSVNUX01PVkVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9NT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENsZWFyRXZlbnQ+IExJU1RfQ0xFQVJfRVZFTlRfQ0xBU1MgPSBMaXN0Q2xlYXJFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDbGVhckV2ZW50PltdIExJU1RfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9DTEVBUl9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VFdmVudD4gTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBMaXN0Q2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2hhbmdlRXZlbnQ+W10gTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVFdmVudD4gVFJFRV9FVkVOVF9DTEFTUyA9IFRyZWVFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVFdmVudD5bXSBUUkVFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQWRkRXZlbnQ+IFRSRUVfQUREX0VWRU5UX0NMQVNTID0gVHJlZUFkZEV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUFkZEV2ZW50PltdIFRSRUVfQUREX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfQUREX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZVJlbW92ZUV2ZW50PiBUUkVFX1JFTU9WRV9FVkVOVF9DTEFTUyA9IFRyZWVSZW1vdmVFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVSZW1vdmVFdmVudD5bXSBUUkVFX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX1JFTU9WRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDbGVhckV2ZW50PiBUUkVFX0NMRUFSX0VWRU5UX0NMQVNTID0gVHJlZUNsZWFyRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2xlYXJFdmVudD5bXSBUUkVFX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfQ0xFQVJfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2hhbmdlRXZlbnQ+IFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTID0gVHJlZUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNoYW5nZUV2ZW50PltdIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGaW5kIGFuZCByZXR1cm4gYSBtZXRob2QgaW1wbGVtZW50ZWQgYnkgdGhlIHRhcmdldCB0aGF0IGNhbiBiZSBpbnZva2VkCi0JICogcmVmbGVjdGl2ZWx5IHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VFdmVudD5bXSBldmVudENsYXNzQXJyYXkpIHsKLQkJTWV0aG9kIG1ldGhvZDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgZXZlbnRDbGFzc0FycmF5KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MSkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MikgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Mik7ICAvLyAiY2hlY2tlZCIgZXhjZXB0aW9ucyBiaXRlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIHN1aXRhYmxlIGZvciBiZWluZyBpbnZva2VkIHdoZW4gYQotCSAqIGNoYW5nZSBldmVudCBoYXMgb2NjdXJyZWQuIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3Qgc3VpdGFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKE1ldGhvZCBtZXRob2QsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VFdmVudD4gZXZlbnRDbGFzcykgewotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpbnQgcGFybVR5cGVzTGVuZ3RoID0gcGFybVR5cGVzLmxlbmd0aDsKLQkJaWYgKHBhcm1UeXBlc0xlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChwYXJtVHlwZXNMZW5ndGggPT0gMSkgJiYgcGFybVR5cGVzWzBdLmlzQXNzaWduYWJsZUZyb20oZXZlbnRDbGFzcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBTdGF0ZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobWV0aG9kLCBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7IG90aGVyd2lzZSwKLQkgKiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobWV0aG9kLCBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7IG90aGVyd2lzZSwKLQkgKiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChhZGRNZXRob2QsIENPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChyZW1vdmVNZXRob2QsIENPTExFQ1RJT05fUkVNT1ZFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjbGVhck1ldGhvZCwgQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2hhbmdlTWV0aG9kLCBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCwgY2xlYXJNZXRob2QsIGNoYW5nZU1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIGNsZWFyTWV0aG9kTmFtZSwgU3RyaW5nIGNoYW5nZU1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKAotCQkJCXRhcmdldCwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBhZGRNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgcmVtb3ZlTWV0aG9kTmFtZSwgQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNsZWFyTWV0aG9kTmFtZSwgQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIENPTExFQ1RJT05fRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBMaXN0Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgcmVwbGFjZU1ldGhvZCwgTWV0aG9kIG1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgTElTVF9BRERfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgTElTVF9SRU1PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlcGxhY2VNZXRob2QsIExJU1RfUkVQTEFDRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobW92ZU1ldGhvZCwgTElTVF9NT1ZFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjbGVhck1ldGhvZCwgTElTVF9DTEVBUl9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2hhbmdlTWV0aG9kLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCwgcmVwbGFjZU1ldGhvZCwgbW92ZU1ldGhvZCwgY2xlYXJNZXRob2QsIGNoYW5nZU1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyByZXBsYWNlTWV0aG9kTmFtZSwgU3RyaW5nIG1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIExJU1RfQUREX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBMSVNUX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgcmVwbGFjZU1ldGhvZE5hbWUsIExJU1RfUkVQTEFDRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbW92ZU1ldGhvZE5hbWUsIExJU1RfTU9WRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBMSVNUX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgTElTVF9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFRyZWVDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgVFJFRV9BRERfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgVFJFRV9SRU1PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBUUkVFX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIFRSRUVfQUREX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBUUkVFX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBUUkVFX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgVFJFRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHJvdGVjdGVkIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbXBsZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2ltcGxlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4M2Q5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2ltcGxlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ2hhbmdlTGlzdGVuZXJ9LgotICogQWxsIGNoYW5nZSBub3RpZmljYXRpb25zIGFyZSBmdW5uZWxlZCB0aHJvdWdoIGEgc2luZ2xlIG1ldGhvZC4KLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYnkKLSAqIHN1YmNsYXNzaW5nIGl0IGFuZCBvdmVycmlkaW5nIGVpdGhlciB7QGxpbmsgI21vZGVsQ2hhbmdlZChDaGFuZ2VFdmVudCl9Ci0gKiAoaWYgYWNjZXNzIHRvIHRoZSBldmVudCBpcyByZXF1aXJlZCkgb3Ige0BsaW5rICNtb2RlbENoYW5nZWQoKX0gKGlmIGFjY2VzcwotICogdG8gdGhlIGV2ZW50IGlzIG5vdCByZXF1aXJlZCkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcgotCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLXsKLQlwdWJsaWMgU2ltcGxlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgbm90aWZpZWQgdGhlIGxpc3RlbmVyIG9mIHRoZSBjaGFuZ2UgZGVzY3JpYmVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBjaGFuZ2UgZXZlbnQuIEJ5IGRlZmF1bHQgdGhlIGxpc3RlbmVyIGV4ZWN1dGVzIHtAbGluayAjbW9kZWxDaGFuZ2VkKCl9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIG5vdGlmaWVkIHRoZSBsaXN0ZW5lciBvZiBhIGNoYW5nZS4KLQkgKiBCeSBkZWZhdWx0IHRoZSBsaXN0ZW5lciB0aHJvd3MgYW4gZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZCgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ4NTgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXJ9IHdoZW4gdGhlIHJlcXVlc3RlZCBsaXN0ZW5lcgotICogbmVlZCBvbmx5IGltcGxlbWVudCBhIHNpbmdsZSBtZXRob2QgKGkuZS4ge0BsaW5rIFN0YXRlQ2hhbmdlTGlzdGVuZXJ9IG9yCi0gKiB7QGxpbmsgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0pLgotICovCi1jbGFzcyBTaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIKLQlleHRlbmRzIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcgotCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotewotCi0JLyoqIHRoZSBtZXRob2Qgd2Ugd2lsbCBpbnZva2Ugb24gdGhlIHRhcmdldCBvYmplY3QgKi8KLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBtZXRob2Q7Ci0JLyoqIGNhY2hlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1ldGhvZElzWmVyb0FyZ3VtZW50OwotCi0JU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JCXRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RhdGVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5tZXRob2RJc1plcm9Bcmd1bWVudCkgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHRoaXMubWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBTdGF0ZUNoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5tZXRob2RJc1plcm9Bcmd1bWVudCkgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHRoaXMubWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiNzg1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGlzIGlzIHByb2JhYmx5IG9mIGxpbWl0ZWQgdXNlLCBzaW5jZSB0aGVyZSBvbmx5IGEgc2luZ2xlIG1ldGhvZCB0byBpbXBsZW1lbnQ7Ci0gKiBtYXliZSBhcyBhIG51bGwgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE4OWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8gCi0gKiBzdWNoIGV4dGVudCB0aGF0IGl0IGNhbm5vdCBiZSBkZWxpbmVhdGVkIGFsbCBhc3BlY3RzIG9mIGl0IHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAqIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5TdGF0ZUNoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIAotICogb2YgYW55IHN1Y2ggY2hhbmdlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vZGVsIGhhcyBjaGFuZ2VkIGluIHNvbWUgZ2VuZXJhbCBmYXNoaW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UuCi0JICovCi0Jdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTMyOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQ2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQwOGFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIHRyZWUuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5UcmVlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCB0cmVlIHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgYWRkZWQgdG8gYSBib3VuZCB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIHBhdGggdG8gdGhlIG5vZGUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0Jdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHJlbW92ZWQgZnJvbSBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCB0cmVlIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCBhbiBlbXB0eSBwYXRoLgotCSAqLwotCXZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIHBvcnRpb24gb2YgYSBib3VuZCB0cmVlIGlzIGNoYW5nZWQgaW4KLQkgKiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCi0JICogdHJlZSB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDVhZGU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCBjb2xsZWN0aW9uIGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbCwgSXRlcmFibGU8RT4KLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sbGVjdGlvbidzIHZhbHVlcy4KLQkgKi8KLQlJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotCQlTdHJpbmcgVkFMVUVTID0gInZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlpbnQgc2l6ZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQwMGQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IGxpc3QgYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIGxpc3QgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwsIEl0ZXJhYmxlPEU+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0J3MgdmFsdWVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBMSVNUX1ZBTFVFUyA9ICJsaXN0IHZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JaW50IHNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBsaXN0LgotCSAqLwotCUUgZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JT2JqZWN0W10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzVlOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHByb3BlcnR5IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBNb2RlbAotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotCSAqLwotCVQgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0M2UzNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSB0byBiZXR0ZXIgc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJ9LgotICogPHA+Ci0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudAotICogd2hlbmV2ZXIgdGhlIG5vZGUncyBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGluIGEgd2F5IHRoYXQgdGhlCi0gKiB0cmVlIGxpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQuCi0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYWxzbyBmaXJlIGEgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLSAqIGV2ZW50IHdoZW5ldmVyIHRoZSBub2RlJ3MgdmFsdWUgY2hhbmdlcy4gVHlwaWNhbGx5LCBvbmx5IG5vZGVzIHRoYXQKLSAqIGhvbGQgInByaW1pdGl2ZSIgZGF0YSB3aWxsIGZpcmUgdGhpcyBldmVudC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBpZiB0aGUgbm9kZQotCSAqIGlzIHRoZSByb290LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbm9kZS4KLQkgKi8KLQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHZhbHVlIG1vZGVsIG9mIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMuCi0JICovCi0JTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKi8KLQlpbnQgY2hpbGRyZW5TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkLgotCSAqLwotCWludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZiAoaS5lLiBpdCBoYXMgbm8gY2hpbGRyZW4pCi0JICovCi0JYm9vbGVhbiBpc0xlYWYoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYTZmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gYWJzdHJhY3QgdHJlZSBhY2Nlc3NpbmcgYW5kCi0gKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCBtYWtlIGl0IG1vcmUgcGx1Z2dhYmxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiB2YWx1ZXMgaGVsZCBieSB0aGUgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyZWUncyBub2Rlcy4KLQkgKi8KLQlJdGVyYXRvcjxFPiBub2RlcygpOwotCQlTdHJpbmcgTk9ERVMgPSAibm9kZXMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2VjYjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZQotICogY29sbGVjdGlvbidzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWVzIGFuZCBmaXJlIGEgY29sbGVjdGlvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgQ29sbGVjdGlvblZhbHVlTW9kZWwjVkFMVUVTCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTZmNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlCi0gKiBsaXN0cydzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgbGlzdCB2YWx1ZXMgYW5kIGZpcmUgYSBsaXN0IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBMaXN0VmFsdWVNb2RlbCNMSVNUX1ZBTFVFUwotCSAqLwotCXZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIzMWQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBhbmQgZmlyZSBhIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwjVkFMVUUKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGQ2NDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NTYxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDQ0YWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjMyIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg4NTk4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMy4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gb3JnLmVjbGlwc2UuanB0LmRiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LAotIG9yZy5lY2xpcHNlLnN3dCwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cyxvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cyIKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUzZjQwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzk1NmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEV4dGVuc2lvbiBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyZWZmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtcyI+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkJCWlkPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybSIKLQkJCWxhYmVsPSJUZXN0IEpwYSBQbGF0Zm9ybSIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybUZhY3RvcnkiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBsYXRmb3JtVWlzIj4KLQkJCi0JCTxqcGFQbGF0Zm9ybVVpCi0JCQlpZD0iY29yZS50ZXN0SnBhUGxhdGZvcm0udWkiCi0JCQlqcGFQbGF0Zm9ybT0iY29yZS50ZXN0SnBhUGxhdGZvcm0iCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9FeHRlbnNpb25UZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZmY5OTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblRlc3RQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEV4dGVuc2lvblRlc3RQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFeHRlbnNpb25UZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTE0MzliLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxBbm5vdGF0aW9uPgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRlc3RBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDQwYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChUZXN0SnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0MTNiZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFUZXN0VHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVFlQRV9NQVBQSU5HX0tFWSA9ICJ0ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVFlQRV9BTk5PVEFUSU9OX05BTUUgPSAidGVzdC5UZXN0IjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRFU1RfVFlQRV9BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBURVNUX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZURiSW5mbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTk2ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0VHlwZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWFlZjBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFCYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNpY01hcHBpbmcKLXsKLQlwdWJsaWMgVGVzdEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhRW50aXR5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkYmI3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RKYXZhRW50aXR5Ci17Ci0JcHJvdGVjdGVkIFRlc3RKYXZhRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA4Y2EzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0SnBhRmFjdG9yeQotewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWU4ZTEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybUZhY3RvcnkuU2ltcGxlVmVyc2lvbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1GYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFRlc3RKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgVGVzdEpwYUZhY3RvcnkoKSwgCi0JCQluZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcihHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKSwgCi0JCQlUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVWZXJzaW9uKEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMV8wKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCQlyZXR1cm4gIkJPT09ZQUghIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5NQVlCRTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmI3M2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvcmUudGVzdEpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKLQkJCW5ldyBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKLQkJLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCQlyZXR1cm4gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0b3BsaW5rKSB1c2VzCi0JCXJldHVybiBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07ICAvLyBhZGRlZAotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAodG9wbGluaykgdXNlcwotCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0b3BsaW5rKSB1c2VzCi0JCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCUphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07IC8vIGFkZGVkCi0JfQotCQotCS8vICoqKioqKioqKiogTWFwcGluZyBGaWxlcyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc291cmNlRGVmaW5pdGlvbltdIGJ1aWxkUmVzb3VyY2VEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCQlHZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjBkZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkgaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCi0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGQ5MWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjAxMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjNkMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMToxMSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzYjA4ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwuSnB0RGJUZXN0c1BsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMiw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4xIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbDtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtczt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwZDAxMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9kZXJieS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyZDE1Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9kZXJieS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwgZm9yIERlcmJ5Ci11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovZGVyYnkvbGliL2RlcmJ5LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZCBmb3IgRGVyYnkKLSMgdXJsID0gamRiYzpkZXJieTpDOi9kZXJieS9kYXRhL3Rlc3RkYjtjcmVhdGU9dHJ1ZQotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9teXNxbC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDdkZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9teXNxbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9teXNxbC9teXNxbC1jb25uZWN0b3ItamF2YS01LjAuNi1iaW4uamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIG9wdGlvbmFsIGZvciBNeVNRTAotIyB1cmwgPSBqZGJjOm15c3FsOi8vbG9jYWxob3N0OjMzMDYKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTExYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmM1LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTp0ZXN0ZGIKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnWEUucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2MwMWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnWEUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSBzY290dAotcGFzc3dvcmQgPSB0aWdlcgotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzUuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6b3JhY2xlOnRoaW46QGxvY2FsaG9zdDoxNTIxOlhFCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTlpLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkxMWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTlpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmM1LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTp0ZXN0ZGIKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZhZmU0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovcG9zdGdyZXNxbC9qZGJjL3Bvc3RncmVzcWwtOC4yLTUwNS5qZGJjMy5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgb3B0aW9uYWwgZm9yIFBvc3RncmVTUUwKLSMgdXJsID0gamRiYzpwb3N0Z3Jlc3FsCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJiNjQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9zcWxzZXJ2ZXIvbGliL3NxbGpkYmMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6c3Fsc2VydmVyOi8vbG9jYWxob3N0OjE0MzMKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzZDVkNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovc3liYXNlL2xpYi9qY29ubjMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6c3liYXNlOlRkczpsb2NhbGhvc3Q6NTAwMAotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0ZmUyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEpQQSBEQiBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTA1ZDc2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGVzZSBhcmVuJ3QgdGVzdHMuIFRoZXkgYXJlIGp1c3QgYW4gZWFzeSB3YXkgdG8gZHVtcCBKREJDIG1ldGFkYXRhIHRvIHRoZQotICogY29uc29sZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSkRCQ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEpEQkNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVyYnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoREVSQlkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNeVNRTCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShNWVNRTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yYWNsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShPUkFDTEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQb3N0Z3JlU1FMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKFBPU1RHUkVTUUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoU1lCQVNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wTWV0YURhdGEoQ29ubmVjdGlvbkNvbmZpZyBjb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqIFBMQVRGT1JNOiAiICsgY29uZmlnLnBsYXRmb3JtTmFtZSArICIgKioqKioiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCUNsYXNzLmZvck5hbWUoY29uZmlnLmRyaXZlckNsYXNzTmFtZSk7Ci0JCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbih0aGlzLmJ1aWxkVVJMKGNvbmZpZyksIGNvbmZpZy51c2VyLCBjb25maWcucGFzc3dvcmQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNBVEFMT0dTOiIpOwotCQlKREJDVG9vbHMuZHVtcChjb25uZWN0aW9uLmdldE1ldGFEYXRhKCkuZ2V0Q2F0YWxvZ3MoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNDSEVNQVRBOiIpOwotCQlKREJDVG9vbHMuZHVtcChjb25uZWN0aW9uLmdldE1ldGFEYXRhKCkuZ2V0U2NoZW1hcygpKTsKLQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVVJMKENvbm5lY3Rpb25Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiAiamRiYzoiICsgY29uZmlnLmRhdGFiYXNlVVJMOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBERVJCWSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIkRlcmJ5IiwKLQkJCSJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIiLAotCQkJImRlcmJ5OkM6L2RlcmJ5L2RhdGEvdGVzdCIsCi0JCQludWxsLAotCQkJbnVsbAotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIE1ZU1FMID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiTXlTUUwiLAotCQkJImNvbS5teXNxbC5qZGJjLkRyaXZlciIsCi0JCQkibXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiIsCi0JCQkicm9vdCIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIE9SQUNMRSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIk9yYWNsZSIsCi0JCQkib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIiwKLQkJCSJvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6b3JjbCIsCi0JCQkic2NvdHQiLAotCQkJInRpZ2VyIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIFBPU1RHUkVTUUwgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJQb3N0Z3JlU1FMIiwKLQkJCSJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiLAotCQkJInBvc3RncmVzcWw6cG9zdGdyZXMiLAotCQkJInBvc3RncmVzIiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQkvLyB0aGUgU3liYXNlIHNlcnZlciBtdXN0IGJlIGNvbmZpZ3VyZWQgZXhwbGljaXRseSB0byAibG9jYWxob3N0IgotCS8vIGluIHRoZSBjb25maWcgZmlsZSBbU1lCQVNFXS9pbmkvc3FsLmluaQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBTWUJBU0UgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJTeWJhc2UiLAotCQkJImNvbS5zeWJhc2UuamRiYzMuamRiYy5TeWJEcml2ZXIiLAotCQkJInN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAiLAotCQkJInNhIiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25Db25maWcgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBsYXRmb3JtTmFtZTsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkcml2ZXJDbGFzc05hbWU7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZGF0YWJhc2VVUkw7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdXNlcjsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25Db25maWcoCi0JCQkJU3RyaW5nIHBsYXRmb3JtTmFtZSwKLQkJCQlTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lLAotCQkJCVN0cmluZyBkYXRhYmFzZVVSTCwKLQkJCQlTdHJpbmcgdXNlciwKLQkJCQlTdHJpbmcgcGFzc3dvcmQKLQkJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7Ci0JCQl0aGlzLmRyaXZlckNsYXNzTmFtZSA9IGRyaXZlckNsYXNzTmFtZTsKLQkJCXRoaXMuZGF0YWJhc2VVUkwgPSBkYXRhYmFzZVVSTDsKLQkJCXRoaXMudXNlciA9IHVzZXI7Ci0JCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVG9vbHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjOThmZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZXN1bHRTZXRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSkRCQ1Rvb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCWR1bXAoZXhlY3V0ZShjb25uZWN0aW9uLCBzcWwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCWR1bXBPbihyZXN1bHRTZXQsIHB3KTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wT24oUmVzdWx0U2V0IHJlc3VsdFNldCwgUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcHMgPSBjb252ZXJ0VG9NYXBzKHJlc3VsdFNldCk7Ci0JCWZvciAoSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcFN0cmVhbSA9IG1hcHMuaXRlcmF0b3IoKTsgbWFwU3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U3RyZWFtID0gbWFwU3RyZWFtLm5leHQoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGVudHJ5U3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJ5U3RyZWFtLm5leHQoKTsKLQkJCQlwdy5wcmludChlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJcHcucHJpbnQoIiA9ICIpOwotCQkJCXB3LnByaW50KGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCWlmIChtYXBTdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50bG4oInRvdGFsIHJvd3M6ICIgKyBtYXBzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGNvbnZlcnRUb01hcHMoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnZlcnRUb01hcHMoZXhlY3V0ZShjb25uZWN0aW9uLCBzcWwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc3VsdFNldCBleGVjdXRlKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0YXRlbWVudCgpOwotCQlzdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOwotCQlSZXN1bHRTZXQgcmVzdWx0U2V0ID0gc3RhdGVtZW50LmdldFJlc3VsdFNldCgpOwotCQlzdGF0ZW1lbnQuY2xvc2UoKTsKLQkJcmV0dXJuIHJlc3VsdFNldDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gY29udmVydFRvTWFwcyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gbmV3IEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKLQkJZm9yIChJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gc3RyZWFtID0gYnVpbGRNYXBJdGVyYXRvcihyZXN1bHRTZXQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXJvd3MuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiByb3dzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGJ1aWxkTWFwSXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KHJlc3VsdFNldCwgbmV3IE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihidWlsZENvbHVtbk5hbWVzKHJlc3VsdFNldCkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGJ1aWxkQ29sdW1uTmFtZXMoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJbmFtZXNbaV0gPSByZXN1bHRTZXQuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5OYW1lKGkgKyAxKTsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYXBSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIgaW1wbGVtZW50cyBSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXM7Ci0JCXB1YmxpYyBNYXBSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIoU3RyaW5nW10gY29sdW1uTmFtZXMpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzID0gY29sdW1uTmFtZXM7Ci0JCX0KLQkJcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHRoaXMuY29sdW1uTmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW1hcC5wdXQodGhpcy5jb2x1bW5OYW1lc1tpXSwgcnMuZ2V0T2JqZWN0KGkgKyAxKSk7ICAvLyBOQjogUmVzdWx0U2V0IGluZGV4L3N1YnNjcmlwdCBpcyAxLWJhc2VkCi0JCQl9Ci0JCQlyZXR1cm4gbWFwOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzNGQwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXMuQWxsUGxhdGZvcm1UZXN0czsKLQotLyoqCi0gKiAgSlBUIERCIFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHREYlRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHREYlRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBBbGxQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSnB0RGJUZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0c1BsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1MTdiNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqICBKcHREYlRlc3RzUGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHREYlRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHREYlRlc3RzUGx1Z2luIElOU1RBTkNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0RGJUZXN0c1BsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0RGJUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmVjZTdlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFBsYXRmb3JtVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERlcmJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTXlTUUxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGUxMGdUZXN0cy5jbGFzcyk7Ci0vLwkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTEwZ1hFVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGU5aVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBvc3RncmVTUUxUZXN0cy5jbGFzcyk7Ci0vLwkJc3VpdGUuYWRkVGVzdFN1aXRlKFNRTFNlcnZlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5YmFzZVRlc3RzLmNsYXNzKTsKLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbGxQbGF0Zm9ybVRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNTliYWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSURyaXZlck1nbXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklQcm9wZXJ0eVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuUHJvcGVydHlTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5YTUxGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5Db25uZWN0aXZpdHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleS5Db2x1bW5QYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5KcHREYlRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlc3VsdFNldEl0ZXJhdG9yOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRlc3RpbmcgRFRQIHdyYXBwZXJzIG9uIHZhcmlvdXMgZGF0YWJhc2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVFBQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogVGhlIHBsYXRmb3JtIHByb3BlcnRpZXMgYXJlIGxvYWRlZCBmcm9tIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgaW4gdGhlCi0JICogJ29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcnIGRpcmVjdG9yeS4gRWFjaCBkYXRhYmFzZSBwbGF0Zm9ybSBoYXMKLQkgKiBpdHMgb3duIHByb3BlcnRpZXMgZmlsZSAoZS5nLiAnZGVyYnkucHJvcGVydGllcycpLgotCSAqLwotCXByaXZhdGUgUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSB3cmFwcGVyLgotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0NPTkZJR19ESVJFQ1RPUlkgPSAiY29uZmlnIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VU0VSX0lEX1BST1BFUlRZID0gInVzZXJJRCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VU0VSX0lEX0RFRkFVTFQgPSAidXNlciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfUEFTU1dPUkRfUFJPUEVSVFkgPSAicGFzc3dvcmQiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfUEFTU1dPUkRfREVGQVVMVCA9ICIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0RSSVZFUl9KQVJTX1BST1BFUlRZID0gImphcnMiOwotCQkvLyByZXF1aXJlZCAtIG5vIGRlZmF1bHQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VUkxfUFJPUEVSVFkgPSAidXJsIjsKLQkJLy8gcmVxdWlyZWQgLSBubyBkZWZhdWx0Ci0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRFRQUGxhdGZvcm1UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2V0LXVwL3RlYXItZG93biAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gdGhpcy5sb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0JCXRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uRmlsZSgpOwotCQl0aGlzLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGUoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmdldFByb2ZpbGVOYW1lKCksIERhdGFiYXNlRmluZGVyLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7Ci0JCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gbnVsbDsKLQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCS8vICoqKioqIHBsYXRmb3JtIHByb3BlcnRpZXMgZmlsZQotCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcC5sb2FkKHRoaXMuYnVpbGRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlVVJMKCkub3BlblN0cmVhbSgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgYnVpbGRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlVVJMKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKHRoaXMuZ2V0VGVzdFBsdWdpbkJ1bmRsZUlEKCkpLmdldEVudHJ5KHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdFBsdWdpbkJ1bmRsZUlEKCkgewotCQlyZXR1cm4gSnB0RGJUZXN0c1BsdWdpbi5CVU5ETEVfSUQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0RpcmVjdG9yeU5hbWUoKSArICcvJyArIHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNEaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWTsKLQl9Ci0KLQkvKioKLQkgKiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcyBhIHNlcGFyYXRlIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUgJ2NvbmZpZycKLQkgKiBkaXJlY3RvcnkgdGhhdCBtdXN0IGJlIGN1c3RvbWl6ZWQgYnkgd2hvbWV2ZXIgaXMgZXhlY3V0aW5nIHRoZSB0ZXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCk7Ci0KLQkvLyAqKioqKiBkcml2ZXIgZGVmaW5pdGlvbiBmaWxlCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvbkZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldFN0b3JhZ2VMb2NhdGlvbih0aGlzLmdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpKTsKLQkJWE1MRmlsZU1hbmFnZXIuc2V0RmlsZU5hbWUodGhpcy5nZXREVFBEcml2ZXJGaWxlTmFtZSgpKTsKLQotCQlJUHJvcGVydHlTZXRbXSBzZXRzID0gWE1MRmlsZU1hbmFnZXIubG9hZFByb3BlcnR5U2V0cygpOwotCQlmb3IgKElQcm9wZXJ0eVNldCBzZXQgOiBzZXRzKSB7Ci0JCQlpZiAoc2V0LmdldElEKCkuZXF1YWxzKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpKSB7Ci0JCQkJcmV0dXJuOyAgLy8gcHJvcGVydHkgc2V0cyBsaXZlIGFjcm9zcyB0ZXN0cwotCQkJfQotCQl9Ci0KLQkJWE1MRmlsZU1hbmFnZXIuc2F2ZU5hbWVkUHJvcGVydHlTZXQodGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0eVNldHMoKSk7Ci0KLQkJLy8gdmVyaWZ5IHRoZSBmaWxlIHdhcyBjcmVhdGVkOgotCQlGaWxlIGRyaXZlckRlZmluaXRpb25lRmlsZSA9IHRoaXMuZ2V0RFRQRHJpdmVyRGVmaW5pdGlvbkxvY2F0aW9uKCkuYXBwZW5kKHRoaXMuZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSkudG9GaWxlKCk7Ci0JCWFzc2VydFRydWUoZHJpdmVyRGVmaW5pdGlvbmVGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIENvbm5lY3Rpdml0eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERUUERyaXZlckZpbGVOYW1lKCkgewotCQlyZXR1cm4gSURyaXZlck1nbXRDb25zdGFudHMuRFJJVkVSX0ZJTEU7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlTZXRbXSBidWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0eVNldHMoKSB7Ci0JCUlQcm9wZXJ0eVNldFtdIHByb3BlcnR5U2V0cyA9IG5ldyBJUHJvcGVydHlTZXRbMV07Ci0JCVByb3BlcnR5U2V0SW1wbCBwcm9wZXJ0eVNldCA9IG5ldyBQcm9wZXJ0eVNldEltcGwodGhpcy5nZXREcml2ZXJOYW1lKCksIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpOwotCQlwcm9wZXJ0eVNldC5zZXRQcm9wZXJ0aWVzKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCksIHRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydGllcygpKTsKLQkJcHJvcGVydHlTZXRzWzBdID0gcHJvcGVydHlTZXQ7Ci0JCXJldHVybiBwcm9wZXJ0eVNldHM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoQ29ubmVjdGlvblByb2ZpbGUuRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lELCB0aGlzLmdldERyaXZlckRlZmluaXRpb25UeXBlKCkpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9KQVJfTElTVF9QUk9QX0lELCB0aGlzLmdldEpEQkNEcml2ZXJKYXJMaXN0KCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyQ2xhc3MoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmdldEpEQkNVUkwoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMuZ2V0VXNlcklEKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLmdldFBhc3N3b3JkKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGUgSkFSIGxpc3QgaXMgd29ya3NwYWNlLXNwZWNpZmljIGFuZCBpcyBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKREJDRHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVxdWlyZWRQbGF0Zm9ybVByb3BlcnR5KERCX0RSSVZFUl9KQVJTX1BST1BFUlRZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJDbGFzcygpOwotCi0JLyoqCi0JICogVGhlIGRhdGFiYXNlIFVSTCBpcyB3b3Jrc3BhY2Utc3BlY2lmaWMgYW5kIGlzIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlCi0JICogZm9yIHNvbWUgZGF0YWJhc2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEpEQkNVUkwoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9VUkxfUFJPUEVSVFksIHRoaXMuZ2V0RGVmYXVsdEpEQkNVUkwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIElEIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VySUQoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9VU0VSX0lEX1BST1BFUlRZLCBEQl9VU0VSX0lEX0RFRkFVTFQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXNzd29yZCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfUEFTU1dPUkRfUFJPUEVSVFksIERCX1BBU1NXT1JEX0RFRkFVTFQpOwotCX0KLQotCS8vICoqKioqIERUUCBjb25uZWN0aW9uIHByb2ZpbGUKLQlwcml2YXRlIHZvaWQgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZSgpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpICE9IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIHByb2ZpbGVzIGxpdmUgYWNyb3NzIHRlc3RzCi0JCX0KLQkJdGhpcy5jcmVhdGVQcm9maWxlKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUodGhpcy5nZXRQcm9maWxlTmFtZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvZmlsZShTdHJpbmcgcHJvZmlsZU5hbWUpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5jcmVhdGVQcm9maWxlKAotCQkJCXByb2ZpbGVOYW1lLAotCQkJCXRoaXMuZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRQcm92aWRlcklEKCksCi0JCQkJdGhpcy5idWlsZERUUENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydGllcygpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9maWxlTmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuIENvbm5lY3Rpb25Qcm9maWxlLkNPTk5FQ1RJT05fUFJPRklMRV9UWVBFOwotCX0KLQkgCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMuZ2V0VXNlcklEKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLmdldFBhc3N3b3JkKCkpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpOwotCi0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmdldERyaXZlckNsYXNzKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5nZXRKREJDVVJMKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpKTsKLQotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRBVEFCQVNFX1NBVkVfUFdEX1BST1BfSUQsIHRoaXMucGFzc3dvcmRJc1NhdmVkKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwYXNzd29yZElzU2F2ZWQoKSB7Ci0JCXJldHVybiAidHJ1ZSI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlTdHJpbmcgY3BOYW1lMSA9IHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSArICIxIjsKLQkJdGhpcy5jcmVhdGVQcm9maWxlKGNwTmFtZTEpOwotCQlJQ29ubmVjdGlvblByb2ZpbGUgZHRwQ1AgPSB0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZShjcE5hbWUxKTsKLQkJYXNzZXJ0Tm90TnVsbChkdHBDUCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTEsIGxpc3RlbmVyLmFkZGVkTmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJU3RyaW5nIGNwTmFtZTIgPSB0aGlzLmdldFByb2ZpbGVOYW1lKCkgKyAiMiI7Ci0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5tb2RpZnlQcm9maWxlKGR0cENQLCBjcE5hbWUyLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTEsIGxpc3RlbmVyLnJlbmFtZWRPbGROYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTIsIGxpc3RlbmVyLnJlbmFtZWROZXdOYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUyKTsKLQkJYXNzZXJ0Tm90TnVsbChjcCk7Ci0KLQkJdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmRlbGV0ZVByb2ZpbGUoZHRwQ1ApOwotCQlhc3NlcnRFcXVhbHMoY3BOYW1lMiwgbGlzdGVuZXIucmVtb3ZlZE5hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCWNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNwTmFtZTIpOwotCQlhc3NlcnROdWxsKGNwKTsKLQotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRQcm9maWxlTmFtZSgpLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzQ29ubmVjdGVkKCkpOwotCi0JCXRoaXMudmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCk7Ci0JCXRoaXMudmVyaWZ5RGF0YWJhc2VWZW5kb3IoKTsKLQkJdGhpcy52ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChkYXRhYmFzZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IGRhdGFiYXNlLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiAtIGFjdHVhbDogIiArIGFjdHVhbDsKLQkJLy8gcGFydGlhbCBtYXRjaCBpcyBnb29kIGVub3VnaAotCQlhc3NlcnRUcnVlKGVycm9yTWVzc2FnZSwgYWN0dWFsLmluZGV4T2YoZXhwZWN0ZWQpICE9IC0xKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlTdHJpbmcgYWN0dWFsID0gZGF0YWJhc2UuZ2V0VmVuZG9yTmFtZSgpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSB0aGlzLmdldERhdGFiYXNlVmVuZG9yKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VDb250ZW50KCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhYmFzZS5zY2hlbWF0YVNpemUoKSA+PSAwKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gZGF0YWJhc2UuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEudGFibGVzU2l6ZSgpID4gMCkgewotCQkJCVRhYmxlIHRhYmxlID0gc2NoZW1hLnRhYmxlcygpLm5leHQoKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmNvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpID49IDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpOwotCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdE9mZmxpbmUoKSB7Ci0JCWlmICggISB0aGlzLmV4ZWN1dGVPZmZsaW5lVGVzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzV29ya2luZ09mZmxpbmUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvck9mZmxpbmVXb3JrKCkgewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyQ29ubmVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5vcGVuZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5va1RvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5hYm91dFRvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5jbG9zZWRQcm9maWxlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJPZmZsaW5lKCkgewotCQlpZiAoICEgdGhpcy5leGVjdXRlT2ZmbGluZVRlc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9wZW5lZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9rVG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmFib3V0VG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmNsb3NlZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyRGF0YWJhc2UoKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJDYXRhbG9nKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyB0YWtlIHRoZSBmaXJzdCBjYXRhbG9nCi0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgPSB0aGlzLmdldEZpcnN0RFRQQ2F0YWxvZygpOwotCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cENhdGFsb2cpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZShjYXRhbG9nLCBsaXN0ZW5lci5jaGFuZ2VkQ2F0YWxvZyk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyU2NoZW1hKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncyA9IHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKTsKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZyA9IG51bGw7Ci0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hID0gbnVsbDsKLQkJU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOwotCQkJZHRwU2NoZW1hID0gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIGR0cENhdGFsb2cuZ2V0U2NoZW1hcygpLmdldCgwKTsKLQkJCXNjaGVtYSA9IHRoaXMuZ2V0Q2F0YWxvZ05hbWVkKGR0cENhdGFsb2cuZ2V0TmFtZSgpKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkdHBDYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJc2NoZW1hID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKGR0cFNjaGVtYS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOyAgLy8gc2hvdWxkIGJlIHRoZSAidmlydHVhbCIgY2F0YWxvZwotCQkJCWFzc2VydEVxdWFscygiIiwgZHRwQ2F0YWxvZy5nZXROYW1lKCkpOwotCQkJCWR0cFNjaGVtYSA9IChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hKSBkdHBDYXRhbG9nLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBoZWxkIGRpcmVjdGx5IGJ5IHRoZSBkYXRhYmFzZSBpbiB0aGlzIHNpdHVhdGlvbgotCQkJCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHNjaGVtYS50YWJsZXNTaXplKCkgPj0gMCk7ICAvLyBmb3JjZSB0YWJsZXMgdG8gYmUgbG9hZGVkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cFNjaGVtYSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgbGlzdGVuZXIuY2hhbmdlZFNjaGVtYSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzID0gdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCWFzc2VydEVxdWFscyhzdXBwb3J0c0NhdGFsb2dzLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKTsKLQkJaWYgKHN1cHBvcnRzQ2F0YWxvZ3MpIHsKLQkJCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmNhdGFsb2dzU2l6ZSgpID4gMCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnNjaGVtYXRhU2l6ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuY2F0YWxvZ3NTaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc2NoZW1hdGFTaXplKCkgPiAwKTsKLQkJfQotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpOwotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0REVCVUcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3MoKTsKLS8vCQl0aGlzLmR1bXBKREJDU2NoZW1hdGEoKTsKLS8vCQl0aGlzLmR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCS8qKgotCSAqIG9ubHkgdmFsaWQgb24gZGF0YWJhc2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgY2F0YWxvZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCXByb3RlY3RlZCBDYXRhbG9nIGdldENhdGFsb2dOYW1lZChTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoY2F0YWxvZ05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRQbGF0Zm9ybVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUtleSkgewotCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvcGVydHlWYWx1ZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhYmFzZSBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGZpbGUgJyIgKyB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkKLQkJCQkJKyAiJyBpcyBtaXNzaW5nIGEgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSAnIiArIHByb3BlcnR5S2V5ICsgIicuIik7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGNwLCAiaGFzQW55TGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChjcCwgImhhc05vTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgbW9kZWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb2ZpbGVNYW5hZ2VyIGdldERUUFByb2ZpbGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbm5lY3Rpb25Qcm9maWxlIGdldERUUENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ29ubmVjdGlvblByb2ZpbGUgZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuIChJQ29ubmVjdGlvblByb2ZpbGUpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShjcCwgImR0cENvbm5lY3Rpb25Qcm9maWxlIik7Ci0JfQotCi0JcHJvdGVjdGVkIElNYW5hZ2VkQ29ubmVjdGlvbiBnZXREVFBNYW5hZ2VkQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIChJTWFuYWdlZENvbm5lY3Rpb24pIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCAiZHRwTWFuYWdlZENvbm5lY3Rpb24iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKCkgewotCQlyZXR1cm4gZ2V0RFRQRGF0YWJhc2UodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBnZXREVFBEYXRhYmFzZShEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKGRhdGFiYXNlLCAiZHRwRGF0YWJhc2UiKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZ2V0RFRQQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldERUUERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0Rmlyc3REVFBDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBDYXRhbG9ncygpLmdldCgwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0RFRQQ2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXREVFBDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZ2V0RFRQQ2F0YWxvZyhDYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZykgQ2xhc3NUb29scy5maWVsZFZhbHVlKGNhdGFsb2csICJkdHBDYXRhbG9nIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZ2V0RFRQU2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldERUUFNjaGVtYSh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShzY2hlbWEsICJkdHBTY2hlbWEiKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhlY3V0ZSBTUUwgKioqKioqKioqKgotCi0JLyoqCi0JICogaWdub3JlIGFueSBlcnJvcnMgKHVzZWZ1bCBmb3IgZHJvcHBpbmcgZGF0YWJhc2Ugb2JqZWN0cyB0aGF0IG1pZ2h0Ci0JICogbm90IGJlIHRoZXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoU3RyaW5nIHNxbCkgewotCQl0cnkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKHNxbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlNRTDogIiArIHNxbCk7Ci0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IGpkYmNTdGF0ZW1lbnQgPSB0aGlzLmNyZWF0ZUpEQkNTdGF0ZW1lbnQoKTsKLQkJdHJ5IHsKLQkJCWpkYmNTdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZShzcWwpOwotCQl9IGZpbmFsbHkgewotCQkJamRiY1N0YXRlbWVudC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wKHNxbCwgMjApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXAoU3RyaW5nIHNxbCwgaW50IGNvbHVtbldpZHRoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcE9uKHNxbCwgcHcsIGNvbHVtbldpZHRoKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBPbihTdHJpbmcgc3FsLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgaW50IGNvbHVtbldpZHRoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcHcucHJpbnRsbihzcWwpOwotCQlmb3IgKEFycmF5TGlzdDxPYmplY3Q+IHJvdyA6IHRoaXMuZXhlY3V0ZShzcWwpKSB7Ci0JCQlmb3IgKE9iamVjdCBjb2x1bW5WYWx1ZSA6IHJvdykgewotCQkJCVN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGVPbihTdHJpbmcudmFsdWVPZihjb2x1bW5WYWx1ZSksIGNvbHVtbldpZHRoLCBwdyk7Ci0JCQkJcHcucHJpbnQoJyAnKTsKLQkJCX0KLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IGV4ZWN1dGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0YXRlbWVudCBqZGJjU3RhdGVtZW50ID0gdGhpcy5jcmVhdGVKREJDU3RhdGVtZW50KCk7Ci0JCWpkYmNTdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOwotCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyhqZGJjU3RhdGVtZW50LmdldFJlc3VsdFNldCgpKTsKLQkJamRiY1N0YXRlbWVudC5jbG9zZSgpOwotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiBidWlsZFJvd3MoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+KCk7Ci0JCWZvciAoSXRlcmF0b3I8QXJyYXlMaXN0PE9iamVjdD4+IHN0cmVhbSA9IHRoaXMuYnVpbGRBcnJheUl0ZXJhdG9yKHJlc3VsdFNldCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcm93cy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJvd3M7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEFycmF5TGlzdDxPYmplY3Q+PiBidWlsZEFycmF5SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8QXJyYXlMaXN0PE9iamVjdD4+KHJlc3VsdFNldCwgbmV3IExpc3RSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIocmVzdWx0U2V0LmdldE1ldGFEYXRhKCkuZ2V0Q29sdW1uQ291bnQoKSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXI8QXJyYXlMaXN0PE9iamVjdD4+IHsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgY29sdW1uQ291bnQ7Ci0JCXB1YmxpYyBMaXN0UmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKGludCBjb2x1bW5Db3VudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uQ291bnQgPSBjb2x1bW5Db3VudDsKLQkJfQotCQlwdWJsaWMgQXJyYXlMaXN0PE9iamVjdD4gYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQlBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KHRoaXMuY29sdW1uQ291bnQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gdGhpcy5jb2x1bW5Db3VudDsgaSsrKSB7ICAvLyBOQjogUmVzdWx0U2V0IGluZGV4L3N1YnNjcmlwdCBpcyAxLWJhc2VkCi0JCQkJbGlzdC5hZGQocnMuZ2V0T2JqZWN0KGkpKTsKLQkJCX0KLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlbWVudCBjcmVhdGVKREJDU3RhdGVtZW50KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gZ2V0SkRCQ0Nvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiAoKENvbm5lY3Rpb25JbmZvKSB0aGlzLmdldERUUE1hbmFnZWRDb25uZWN0aW9uKCkuZ2V0Q29ubmVjdGlvbigpLmdldFJhd0Nvbm5lY3Rpb24oKSkuZ2V0U2hhcmVkQ29ubmVjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZU1ldGFEYXRhIGdldERhdGFiYXNlTWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5nZXRNZXRhRGF0YSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkdW1wIERUUCBtZXRhZGF0YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkdW1wIGFsbCB0aGUgZGF0YWJhc2UgbWV0YWRhdGEgdG8gdGhlIGNvbnNvbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2UoKSB7Ci0JCXRoaXMuZHVtcERhdGFiYXNlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIGR1bXAgdGhlIGRhdGFiYXNlIGNhdGFsb2dzIGFuZCBzY2hlbWF0YSB0byB0aGUgY29uc29sZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKSB7Ci0JCXRoaXMuZHVtcERhdGFiYXNlKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2UoYm9vbGVhbiBkZWVwKSB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBEYXRhYmFzZU9uKHB3LCBkZWVwKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZU9uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCXB3LnByaW50KCJkYXRhYmFzZTogIik7Ci0JCXB3LnByaW50bG4oZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJaWYgKGRhdGFiYXNlLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJZm9yIChJdGVyYXRvcjxDYXRhbG9nPiBzdHJlYW0gPSBkYXRhYmFzZS5jYXRhbG9ncygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmR1bXBDYXRhbG9nT24oc3RyZWFtLm5leHQoKSwgcHcsIGRlZXApOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5kdW1wU2NoZW1hQ29udGFpbmVyT24oZGF0YWJhc2UsIHB3LCBkZWVwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDYXRhbG9nT24oQ2F0YWxvZyBjYXRhbG9nLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCXB3LnByaW50KCJjYXRhbG9nOiAiKTsKLQkJcHcucHJpbnRsbihjYXRhbG9nLmdldE5hbWUoKSk7Ci0JCXB3LmluZGVudCgpOwotCQkJdGhpcy5kdW1wU2NoZW1hQ29udGFpbmVyT24oY2F0YWxvZywgcHcsIGRlZXApOwotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hQ29udGFpbmVyT24oU2NoZW1hQ29udGFpbmVyIHNjaGVtYUNvbnRhaW5lciwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlmb3IgKEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gc2NoZW1hQ29udGFpbmVyLnNjaGVtYXRhKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5kdW1wU2NoZW1hT24oc3RyZWFtLm5leHQoKSwgcHcsIGRlZXApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMuZHVtcFNjaGVtYShzY2hlbWEsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWEoU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBkZWVwKSB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBTY2hlbWFPbihzY2hlbWEsIHB3LCBkZWVwKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWFPbihTY2hlbWEgc2NoZW1hLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCXB3LnByaW50KCJzY2hlbWE6ICIpOwotCQlwdy5wcmludGxuKHNjaGVtYS5nZXROYW1lKCkpOwotCQlpZiAoZGVlcCkgewotCQkJcHcuaW5kZW50KCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxUYWJsZT4gc3RyZWFtID0gc2NoZW1hLnRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQkJdGhpcy5kdW1wVGFibGVPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3I8U2VxdWVuY2U+IHN0cmVhbSA9IHNjaGVtYS5zZXF1ZW5jZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXRoaXMuZHVtcFNlcXVlbmNlT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQkJCX0KLQkJCXB3LnVuZGVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFRhYmxlT24oVGFibGUgdGFibGUsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJ0YWJsZTogIik7Ci0JCXB3LnByaW50bG4odGFibGUuZ2V0TmFtZSgpKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGFibGUuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmR1bXBDb2x1bW5PbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXk+IHN0cmVhbSA9IHRhYmxlLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuZHVtcEZvcmVpZ25LZXlPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDb2x1bW5PbihDb2x1bW4gY29sdW1uLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiY29sdW1uOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJaWYgKGNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSkgewotCQkJcHcucHJpbnQoIiBbcHJpbWFyeSBrZXldIik7Ci0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBGb3JlaWduS2V5T24oRm9yZWlnbktleSBmb3JlaWduS2V5LCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiZm9yZWlnbiBrZXk6ICIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCI9PiIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgKCIpOwotCQlmb3IgKEl0ZXJhdG9yPENvbHVtblBhaXI+IHN0cmVhbSA9IGZvcmVpZ25LZXkuY29sdW1uUGFpcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2x1bW5QYWlyIGNwID0gc3RyZWFtLm5leHQoKTsKLQkJCXB3LnByaW50KGNwLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJcHcucHJpbnQoIj0+Iik7Ci0JCQlwdy5wcmludChjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTZXF1ZW5jZU9uKFNlcXVlbmNlIHNlcXVlbmNlLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgic2VxdWVuY2U6ICIpOwotCQlwdy5wcmludGxuKHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgSkRCQyBtZXRhZGF0YSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3NPbihwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKCJKREJDIGNhdGFsb2dzOiAiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyh0aGlzLmdldERhdGFiYXNlTWV0YURhdGEoKS5nZXRDYXRhbG9ncygpKTsKLQkJCWZvciAoSXRlcmF0b3I8QXJyYXlMaXN0PE9iamVjdD4+IHN0cmVhbSA9IHJvd3MuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJcHcucHJpbnRsbihzdHJlYW0ubmV4dCgpLmdldCgwKSk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBKREJDU2NoZW1hdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcEpEQkNTY2hlbWF0YU9uKHB3KTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBKREJDU2NoZW1hdGFPbihJbmRlbnRpbmdQcmludFdyaXRlciBwdykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXB3LnByaW50bG4oIkpEQkMgc2NoZW1hdGE6ICIpOwotCQlwdy5pbmRlbnQoKTsKLQkJCUFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gcm93cyA9IHRoaXMuYnVpbGRSb3dzKHRoaXMuZ2V0RGF0YWJhc2VNZXRhRGF0YSgpLmdldFNjaGVtYXMoKSk7Ci0JCQlmb3IgKEFycmF5TGlzdDxPYmplY3Q+IHJvdyA6IHJvd3MpIHsKLQkJCQlpZiAocm93LnNpemUoKSA9PSAyKSB7ICAvLyBjYXRhbG9ncyB3ZXJlIGFkZGVkIGluIGpkayAxLjQKLQkJCQkJT2JqZWN0IGNhdGFsb2cgPSByb3cuZ2V0KDEpOwotCQkJCQlwdy5wcmludChjYXRhbG9nKTsKLQkJCQkJcHcucHJpbnQoJy4nKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IHNjaGVtYSA9IHJvdy5nZXQoMCk7Ci0JCQkJcHcucHJpbnRsbihzY2hlbWEpOwotCQkJfQotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBwcm9maWxlIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIHsKLQkJcHVibGljIFN0cmluZyBhZGRlZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVuYW1lZE9sZE5hbWU7Ci0JCXB1YmxpYyBTdHJpbmcgcmVuYW1lZE5ld05hbWU7Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGRlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5yZW1vdmVkTmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQkJdGhpcy5yZW5hbWVkT2xkTmFtZSA9IG9sZE5hbWU7Ci0JCQl0aGlzLnJlbmFtZWROZXdOYW1lID0gbmV3TmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkT2xkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbmFtZWROZXdOYW1lID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBvcGVuZWRQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgbW9kaWZpZWRQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgb2tUb0Nsb3NlUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGFib3V0VG9DbG9zZVByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBjbG9zZWRQcm9maWxlOwotCQlwdWJsaWMgRGF0YWJhc2UgY2hhbmdlZERhdGFiYXNlOwotCQlwdWJsaWMgQ2F0YWxvZyBjaGFuZ2VkQ2F0YWxvZzsKLQkJcHVibGljIFNjaGVtYSBjaGFuZ2VkU2NoZW1hOwotCQlwdWJsaWMgU2VxdWVuY2UgY2hhbmdlZFNlcXVlbmNlOwotCQlwdWJsaWMgVGFibGUgY2hhbmdlZFRhYmxlOwotCQlwdWJsaWMgQ29sdW1uIGNoYW5nZWRDb2x1bW47Ci0JCXB1YmxpYyBGb3JlaWduS2V5IGNoYW5nZWRGb3JlaWduS2V5OwotCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm9wZW5lZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMubW9kaWZpZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5va1RvQ2xvc2VQcm9maWxlID0gcHJvZmlsZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmFib3V0VG9DbG9zZVByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLmNsb3NlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJdGhpcy5jaGFuZ2VkRGF0YWJhc2UgPSBkYXRhYmFzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJCXRoaXMuY2hhbmdlZENhdGFsb2cgPSBjYXRhbG9nOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQkJdGhpcy5jaGFuZ2VkU2NoZW1hID0gc2NoZW1hOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQkJdGhpcy5jaGFuZ2VkU2VxdWVuY2UgPSBzZXF1ZW5jZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpIHsKLQkJCXRoaXMuY2hhbmdlZFRhYmxlID0gdGFibGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCQl0aGlzLmNoYW5nZWRDb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJcHVibGljIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQl0aGlzLmNoYW5nZWRGb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCXRoaXMub3BlbmVkUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLm1vZGlmaWVkUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLm9rVG9DbG9zZVByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5hYm91dFRvQ2xvc2VQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuY2xvc2VkUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWREYXRhYmFzZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRDYXRhbG9nID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZFNjaGVtYSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRTZXF1ZW5jZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRUYWJsZSA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRDb2x1bW4gPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkRm9yZWlnbktleSA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EZXJieVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYWFjZDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EZXJieVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVyYnlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIERlcmJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiZGVyYnkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkxMDEuZ2VuZXJpY0RyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIkRlcmJ5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieV8xMC4xX0VtYmVkZGVkIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJEZXJieSAxMC4xIEVtYmVkZGVkIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5LmVtYmVkZGVkLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIGxvb2t1cF90ZXN0Iik7ICAvLyB0aGlzIGdldHMgZm9sZGVkIHRvIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cFRlc3QiKSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKTsKLQotCQkvLyBGT08KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyg0LCBmb29UYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gc2FsYXJ5Q29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIlNBTEFSWSIpOwotCQlhc3NlcnRFcXVhbHMoIkRFQ0lNQUwiLCBzYWxhcnlDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgc2FsYXJ5Q29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNhbGFyeUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzYWxhcnlDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5mb3JlaWduS2V5cygpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmNvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9JRCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMywgYmFyVGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQotCQlDb2x1bW4gaWQyQ29sdW1uID0gYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIklEMiIpOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZDJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotLy8JCWFzc2VydFRydWUoaWQyQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsgIC8vIGRvZXNuJ3Qgd29yayg/KQotCQlhc3NlcnRGYWxzZShpZDJDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZDJDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWQyQ29sdW1uLmdldFByZWNpc2lvbigpKTsgIC8vIG5vdCBzdXJlIHdoYXQgdG8gZXhwZWN0IGhlcmUuLi4KLQkJYXNzZXJ0RXF1YWxzKDAsIGlkMkNvbHVtbi5nZXRTY2FsZSgpKTsgIC8vIG5vdCBzdXJlIHdoYXQgdG8gZXhwZWN0IGhlcmUgZWl0aGVyLi4uCi0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiQ0hVTksiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gQkFaCi0JCVRhYmxlIGJhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkJBWiIpOwotCQlDb2x1bW4gbmlja25hbWVDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiTklDS05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBuaWNrbmFtZUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShuaWNrbmFtZUNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7ICAvLyBkb2Vzbid0IHdvcmsoPykKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJGT09fQkFaIik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoIkZPT19JRCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRDIgSU5UIFVOSVFVRSBOT1QgTlVMTCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBDSFVOSyBCTE9CKDEwMEspIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT08gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIFNBTEFSWSBERUNJTUFMKDExLCAyKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVJfSUQgSU5UIFJFRkVSRU5DRVMgQkFSKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBJTlQgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTklDS05BTUUgVkFSQ0hBUigyMCkgTk9UIE5VTEwgVU5JUVVFIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT09fQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT09fSUQgSU5UIFJFRkVSRU5DRVMgRk9PKElEKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVpfSUQgSU5UIFJFRkVSRU5DRVMgQkFaKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJDT0xVTU5fVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBDT0xVTU5fVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBDT0xVTU5fVEVTVCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBJTlRFR0VSLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiQ09MVU1OX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJDT0xVTU5fVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIElOVEVHRVIsIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIElOVEVHRVIsIE5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIElOVEVHRVIsIFwiTmFtZVwiIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiQ09MVU1OX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJDT0xVTU5fVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QyIiwgIkVNUCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDEiLCAiT1JHIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgT1JHIChJRCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgRU1QIChJRCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIoMjApLCAiICsKLQkJCQkiT1JHX0lEIElOVEVHRVIgUkVGRVJFTkNFUyBYUkVGX1RFU1QxLk9SRyhJRCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJYUkVGX1RFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJPUkciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoIkVNUCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmZvcmVpZ25LZXlzKCkubmV4dCgpOwotCQlUYWJsZSByZWZUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlZlRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUkciLCByZWZUYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZmsuY29sdW1uUGFpcnNTaXplKCkpOwotCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY3AgPSBmay5jb2x1bW5QYWlycygpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQSBEZXJieSBzY2hlbWEgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIGRyb3BwZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyb3BTY2hlbWEoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgUkVTVFJJQ1QiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlMmQ4Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqIE15U1FMCi0gKiAKLSAqIE5vdGVzOgotICogLSBXZSBjYW4gb25seSBnZXQgZGF0YWJhc2Ugb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggb3VyCi0gKiAgICAgY29ubmVjdGlvbiBwcm9maWxlLgotICogLSBXZSBjYW4gcmVmZXJlbmNlIG9iamVjdHMgYWNyb3NzIG11bHRpcGxlIGRhdGFiYXNlcywgc28gdGhleSBhcmUgc29ydGEgbGlrZQotICogICAgIHNjaGVtYXMuLi4uCi0gKiAtIEZvcmVpZ24ga2V5cyBtdXN0IGJlIGRlZmluZWQgYXMgdGFibGUtbGV2ZWwgY29uc3RyYWludHM7IHRoZXkgY2Fubm90IGJlCi0gKiAgICAgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBjb2x1bW4gY2xhdXNlLgotICogLSBDYXNlLXNlbnNpdGl2aXR5IGFuZCAtZm9sZGluZyBpcyB3aGFja2VkIG9uIE15U1FMLi4uLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNeVNRTFRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgTXlTUUxUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJteXNxbC5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXlzcWwuNF8xLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk15U3FsIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI0LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLm15c3FsLmpkYmMuRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKREJDVVJMKCkgewotCQlyZXR1cm4gImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJNeVNRTF80LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk15U1FMIDQuMSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IHN1cGVyLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLQkJcmV0dXJuICJkYWxpdGVzdCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7ICAvLyBzZWVtcyB0byB3b3JrLi4uCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIERUUDogTXlTUUwgaGFzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgREFUQUJBU0UgIiArIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZyh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImJhcl9pZCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vX2JheiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbk5hbWVkKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJiYXIiKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBJTlRFR0VSLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPUkVJR04gS0VZIChiYXJfaWQpIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBJTlQsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIElOVCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoZm9vX2lkKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGJhel9pZCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT24gV2luZG93cywgdGFibGUgbmFtZXMgZ2V0IGZvbGRlZCB0byBsb3dlcmNhc2UgYnkgZGVmYXVsdDsKLQkgKiBldmVuIGlmIHRoZSBuYW1lIGlzIGRlbGltaXRlZCAoYXBwYXJlbnRseSkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSAiICsgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImBURVNUM2AiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIGBURVNUM2AgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlUYWJsZSB0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQotCQkvLyB0aGlzIHByb2JhYmx5IG9ubHkgd29ya3Mgb24gV2luZG93cwotCQlUYWJsZSB0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQotCQkvLyB0aGlzIHByb2JhYmx5IG9ubHkgd29ya3Mgb24gV2luZG93cwotCQlUYWJsZSB0ZXN0M1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiYHRlc3QzYCIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QzVGFibGUpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImBURVNUM2AiKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFICIgKyB0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2codGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIElOVEVHRVIsIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJOYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGBJZGAgSU5URUdFUiwgYE5hbWVgIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJgSWRgIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImBOYW1lYCIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIG9ubHkgZ2V0IGEgc2luZ2xlICJzY2hlbWEiIHBlciBjb25uZWN0aW9uIHZpYSBEVFAsCi0JICogc28gY3Jvc3Mtc2NoZW1hIHJlZmVyZW5jZXMgYXJlIG5vdCB2aXNpYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MiIpOwotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFIHhyZWZfdGVzdDEiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgb3JnIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIERBVEFCQVNFIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgZW1wIChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBuYW1lIFZBUkNIQVIoMjApLCAiICsKLQkJCQkib3JnX2lkIElOVEVHRVIsIEZPUkVJR04gS0VZIChvcmdfaWQpIFJFRkVSRU5DRVMgeHJlZl90ZXN0MS5vcmcoaWQpKSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQkvLyBubyBmb3JlaWduIGtleXMKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtcFRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MiIpOwotCQl0aGlzLmRyb3BEYXRhYmFzZSgieHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgZGJOYW1lLCBTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgZGJOYW1lICsgJy4nICsgdGFibGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcERhdGFiYXNlKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAiICsgbmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDQ5NTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTEwZ1Rlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgT3JhY2xlMTBnVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZy5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDEwZyBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjEwLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZ18xMC4xLjAuNCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnICgxMC4xLjAuNCkgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldFVzZXJOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNZUyIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgdGVzdDogIiArIHRoaXMuZ2V0Q2xhc3MoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsgIC8vIFNZUyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hCi0JCX0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJLy8gT3JhY2xlIHNob3VsZCBoYXZlIGEgc2NoZW1hIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgdXNlcgotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRVc2VySUQoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiTlVNQkVSIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLm1hdGguQmlnRGVjaW1hbCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUjIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiYmFyX2lkIik7Ci0JCWFzc2VydEVxdWFscygiTlVNQkVSIiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5mb3JlaWduS2V5cygpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmNvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9JRCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMT0IiLCBiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJjaHVuayIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5pc0xPQigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiZm9vX2JheiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImZvb19pZCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgY2h1bmsgQkxPQiIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgZm9vICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUjIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBSRUZFUkVOQ0VTIGJhcihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGJheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIyKDIwKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgZm9vX2JheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgZm9vX2lkIE5VTUJFUigxMCkgUkVGRVJFTkNFUyBmb28oaWQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhel9pZCBOVU1CRVIoMTApIFJFRkVSRU5DRVMgYmF6KGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdDEiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJcInRlc3QzXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFRFU1QyIChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgXCJ0ZXN0M1wiIChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCVRhYmxlIHRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCQl0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQotCQlUYWJsZSB0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQkJdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0KLQkJVGFibGUgdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlwidGVzdDNcIiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QzVGFibGUpOwotCQl0ZXN0M1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDMiKTsKLQkJYXNzZXJ0TnVsbCh0ZXN0M1RhYmxlKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdDEiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJcInRlc3QzXCIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJRCBOVU1CRVIoMTApLCBOQU1FIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOQU1FIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJZCBOVU1CRVIoMTApLCBOYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKFwiSWRcIiBOVU1CRVIoMTApLCBcIk5hbWVcIiBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJJZFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiTmFtZVwiIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0VXNlck5hbWUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscygiU1lTIikpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBlZCB0ZXN0OiAiICsgdGhpcy5nZXRDbGFzcygpICsgJy4nICsgdGhpcy5nZXROYW1lKCkpOwotCQkJcmV0dXJuOyAgLy8gU1lTIGRvZXMgbm90IGhhdmUgYSBzY2hlbWEKLQkJfQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgVVNFUiBYUkVGX1RFU1QyIENBU0NBREUiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFVTRVIgWFJFRl9URVNUMSBDQVNDQURFIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVVNFUiBYUkVGX1RFU1QxIElERU5USUZJRUQgQlkgZm9vIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQUxURVIgVVNFUiBYUkVGX1RFU1QxIFFVT1RBIFVOTElNSVRFRCBPTiBVU0VSUyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBYUkVGX1RFU1QxLk9SRyAoSUQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwgTkFNRSBWQVJDSEFSMigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVVNFUiBYUkVGX1RFU1QyIElERU5USUZJRUQgQlkgZm9vIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQUxURVIgVVNFUiBYUkVGX1RFU1QyIFFVT1RBIFVOTElNSVRFRCBPTiBVU0VSUyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkdSQU5UIEFMTCBPTiBYUkVGX1RFU1QxLk9SRyBUTyBYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFhSRUZfVEVTVDIuRU1QIChJRCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIyKDIwKSwgIiArCi0JCQkJIk9SR19JRCBOVU1CRVIoMTApIFJFRkVSRU5DRVMgWFJFRl9URVNUMS5PUkcoSUQpKSIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlTY2hlbWEgc2NoZW1hMSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMSIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCQlUYWJsZSBvcmdUYWJsZSA9IHNjaGVtYTEuZ2V0VGFibGVOYW1lZCgiT1JHIik7Ci0JCWFzc2VydE5vdE51bGwob3JnVGFibGUpOwotCi0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJYUkVGX1RFU1QyIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0JCVRhYmxlIGVtcFRhYmxlID0gc2NoZW1hMi5nZXRUYWJsZU5hbWVkKCJFTVAiKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXBUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbXBUYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkgZmsgPSBlbXBUYWJsZS5mb3JlaWduS2V5cygpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmNvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuY29sdW1uUGFpcnMoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIk9SR19JRCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBVU0VSIFhSRUZfVEVTVDIgQ0FTQ0FERSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgVVNFUiBYUkVGX1RFU1QxIENBU0NBREUiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgVEFCTEUgIiArIHRhYmxlTmFtZSArICIgQ0FTQ0FERSBDT05TVFJBSU5UUyIpOwotCX0KLQotLy8gbmVlZCBPcmFjbGUgZW5hYmxlbWVudCBwbHVnLWluCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJGT09fU0VRIik7Ci0vLwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNFUVVFTkNFIEZPT19TRVEiKTsKLS8vCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLS8vCi0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFNlcXVlbmNlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT09fU0VRIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIkZPT19TRVEiKTsKLS8vCi0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgdm9pZCBkcm9wU2VxdWVuY2UoU3RyaW5nIHNlcXVlbmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFNFUVVFTkNFICIgKyBzZXF1ZW5jZU5hbWUpOwotLy8JfQotLy8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wVXNlck9iamVjdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wKCJzZWxlY3QgKiBmcm9tIHVzZXJfb2JqZWN0cyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdYRVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMDlmOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnWEVUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTEwZ1hFVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZ1hFLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnX1hFIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgWEUgUmVsZWFzZSAyICgxMC4yKSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWM0NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgT3JhY2xlIDlpIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlOWlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTlpVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTlpLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgOWkgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS45LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlOWkiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk9yYWNsZTlpIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyB3b3JraW5nIG9mZmxpbmUgaXMgcHJldHR5IHVnbHkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZmVlYTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQb3N0Z3JlU1FMVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBQb3N0Z3JlU1FMVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInBvc3RncmVzcWwucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uUG9zdGdyZVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5wb3N0Z3Jlc3FsLnBvc3RncmVzcWxEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJwb3N0Z3JlcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOC54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJLy8gdXNpbmcgdGhpcyBVUkwgd2lsbCByZXN1bHQgaW4gdGhlIERUUCBkYXRhYmFzZSBjb250YWluaW5nIGEgc2luZ2xlCi0JCS8vIGNhdGFsb2cgbmFtZWQgIiIgLSB3aGljaCwgdW5mb3J0dW5hdGVseSwgcmVzZW1ibGVzIHRoZSBwc2V1ZG8tY2F0YWxvZwotCQkvLyBnZW5lcmF0ZWQgYnkgRFRQIGZvciBkYXRhYmFzZXMgdGhhdCBkbyBub3QgcmV0dXJuIGFueSBjYXRhbG9ncyB2aWEKLQkJLy8gSkRCQyBtZXRhZGF0YSBjYWxscy4uLgotCQlyZXR1cm4gImpkYmM6cG9zdGdyZXNxbCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIDguMiBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyBEVFAgZG9lcyBub3Qgc3VwcG9ydCBQb3N0Z3JlU1FMIG9mZi1saW5lIC0gc2VlIDIyNjcwNC8yNDE1NTgKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMSIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QyIik7Ci0JCWFzc2VydE51bGwoc2NoZW1hMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCXNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgTE9PS1VQX1RFU1QiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJMT09LVVBfVEVTVCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF90ZXN0IikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfdGVzdFwiIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUlkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBsb29rdXBfdGVzdCIpOyAgLy8gdGhpcyBnZXRzIGZvbGRlZCB0byBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb29rdXBfdGVzdCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBUZXN0IikpOwotCQlhc3NlcnROdWxsKHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBfVGVzdCIpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0Iik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIik7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIik7Ci0KLQkJLy8gRk9PCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuY29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5mb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCWVRFQSIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJLy8gYXNzZXJ0VHJ1ZShiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJDSFVOSyIpLmRhdGFUeXBlSXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJGT09fSUQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFSICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENIVU5LIGJ5dGVhIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT08gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTkFNRSB2YXJjaGFyKDIwKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVJfSUQgaW50ZWdlciBSRUZFUkVOQ0VTIEJBUihJRCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBWiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIHZhcmNoYXIoMjApIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT09fQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT09fSUQgaW50IFJFRkVSRU5DRVMgRk9PKElEKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVpfSUQgaW50IFJFRkVSRU5DRVMgQkFaKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBUQUJMRV9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIGludCwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJRCBpbnQsIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOQU1FIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIGludCwgTmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgaW50LCBcIk5hbWVcIiB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QyIiwgIkVNUCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDEiLCAiT1JHIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgT1JHIChJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCBOQU1FIHZhcmNoYXIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgRU1QIChJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCBOQU1FIHZhcmNoYXIoMjApLCAiICsKLQkJCQkiT1JHX0lEIGludGVnZXIgUkVGRVJFTkNFUyBYUkVGX1RFU1QxLk9SRyhJRCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJ4cmVmX3Rlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJvcmciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoInhyZWZfdGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoImVtcCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmZvcmVpZ25LZXlzKCkubmV4dCgpOwotCQlUYWJsZSByZWZUYWJsZSA9IGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlZlRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmciLCByZWZUYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZmsuY29sdW1uUGFpcnNTaXplKCkpOwotCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY3AgPSBmay5jb2x1bW5QYWlycygpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygib3JnX2lkIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFNjaGVtYShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihuYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgU0NIRU1BICIgKyBuYW1lICsgIiBDQVNDQURFIik7Ci0JCX0KLQl9Ci0KLS8vIHNlZSAyNDE1NzgvMjQxNTU3Ci0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJTRVFVRU5DRV9URVNUIiwgIkZPTyIpOwotLy8JCXRoaXMuZHJvcFNjaGVtYSgiU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgU0VRVUVOQ0VfVEVTVCIpOwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PIFNUQVJUIDEiKTsKLS8vLy8JCUxpc3Q8T2JqZWN0W10+IGxpc3QgPSB0aGlzLmV4ZWN1dGUoIlNFTEVDVCBuZXh0dmFsKCdmb28nKSIpOwotLy8vLwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJTRVFVRU5DRV9URVNUIik7Ci0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSBzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZCgiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJmb29fc2VxIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIlNFUVVFTkNFX1RFU1QiLCAiRk9PIik7Ci0vLwkJdGhpcy5kcm9wU2NoZW1hKCJTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHZvaWQgZHJvcFNlcXVlbmNlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlTY2hlbWEgc2NoZW1hPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoc2NoZW1hTmFtZSk7Ci0vLwkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0vLwkJCWlmIChzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZChzZXF1ZW5jZU5hbWUpICE9IG51bGwpIHsKLS8vCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTRVFVRU5DRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHNlcXVlbmNlTmFtZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRkZTVkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBTUUwgU2VydmVyIDIwMDUgRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU1FMU2VydmVyVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBTUUxTZXJ2ZXJUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAic3Fsc2VydmVyLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJNaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXNmdC5zcWxzZXJ2ZXIuMjAwNS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJTUUxTZXJ2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjIwMDUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiU1FMU2VydmVyXzIwMDUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy5jb25uZWN0aW9uUHJvZmlsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7ICAvLyBoYXZlbid0IGFjdHVhbGx5IHRyaWVkIHRoaXMgeWV0Li4uCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjU0Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TeWJhc2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5YmFzZVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgU3liYXNlVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInN5YmFzZS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlIEpEQkMgRHJpdmVyIGZvciBTeWJhc2UgQVNFIDE1LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uU3liYXNlIEpEQkMgRHJpdmVyIGZvciBTeWJhc2UgQVNFIDE1LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5zeWJhc2UuYXNlLmdlbmVyaWNEcml2ZXJUZW1wbGF0ZV8xNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJTeWJhc2VfQVNFIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxNS54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5zeWJhc2UuamRiYzMuamRiYy5TeWJEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlXzE1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJTeWJhc2UgQVNFIDE1IGpDb25uZWN0IEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3liYXNlICJkYXRhYmFzZXMiIGJlY29tZSBEVFAgImNhdGFsb2dzIgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0ZXN0MiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRlc3QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCUNhdGFsb2cgY2F0YWxvZzEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cxKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSBjYXRhbG9nMS5nZXRTY2hlbWFOYW1lZCgiZGJvIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hMSwgY2F0YWxvZzEuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0ZXN0MiIpOwotCQlDYXRhbG9nIGNhdGFsb2cyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDIiKTsKLQkJYXNzZXJ0TnVsbChjYXRhbG9nMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCWNhdGFsb2cyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gY2F0YWxvZzIuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCi0JCWFzc2VydE5vdFNhbWUoY2F0YWxvZzEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QxIikpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgY2F0YWxvZyBhZnRlciB0aGUgcmVmcmVzaAotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QxIikuZ2V0RGVmYXVsdFNjaGVtYSgpKTsgIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IHNjaGVtYSBhZnRlciB0aGUgcmVmcmVzaAotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB0ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGVzdDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0YWJsZV90ZXN0Iik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ0YWJsZV90ZXN0Iik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0YWJsZV90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCS8vIGZvbwotCQlUYWJsZSBmb29UYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZENvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBpZENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzTE9CKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNOdWxsYWJsZSgpKTsgIC8vIGltcGxpZWQgIk5PVCBOVUxMIiA/Ci0KLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIG5hbWVDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIG5hbWVDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygyMCwgbmFtZUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImJhcl9pZCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCUNvbHVtbiBjaHVua0NvbHVtbiA9IGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpOwotCQlhc3NlcnRFcXVhbHMoIklNQUdFIiwgY2h1bmtDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShjaHVua0NvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUoY2h1bmtDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgY2h1bmtDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEJBWgotCQlUYWJsZSBiYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGJhelRhYmxlLmNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmF6VGFibGUucHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmF6VGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJuaWNrbmFtZSIpOwotCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJQ29sdW1uIHNvbmdDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgic29uZyIpOwotCQlhc3NlcnRGYWxzZShzb25nQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJQ29sdW1uIHNhbGFyeUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJzYWxhcnkiKTsKLQkJYXNzZXJ0RmFsc2Uoc2FsYXJ5Q29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUNJTUFMIiwgc2FsYXJ5Q29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzYWxhcnlDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNhbGFyeUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygyLCBzYWxhcnlDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgc2FsYXJ5Q29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2FsYXJ5Q29sdW1uLmlzTE9CKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5jb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiZm9vX2lkIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBmb29fYmF6Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBiYXoiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgYmFyIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBiYXIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgY2h1bmsgaW1hZ2UiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIHZhcmNoYXIoMjApIHVuaXF1ZSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgaW50ZWdlciByZWZlcmVuY2VzIGJhcihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGJheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuaWNrbmFtZSB2YXJjaGFyKDIwKSBudWxsLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHNvbmcgdmFyY2hhcigyMCkgbm90IG51bGwsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgc2FsYXJ5IGRlY2ltYWwoMTAsIDIpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBmb29fYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBmb29faWQgaW50ZWdlciByZWZlcmVuY2VzIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIGludGVnZXIgcmVmZXJlbmNlcyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ0YWJsZV9sb29rdXBfdGVzdCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QxIChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBURVNUMiAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgW1Rlc3QzXSAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRhYmxlX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlTmFtZWQoInRlc3QxIikpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QxIikpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlTmFtZWQoIlRFU1QyIikpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QyIikpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiW1Rlc3QzXSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgW1Rlc3QzXSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QxIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGFibGVfbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIGNvbHVtbl9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygiY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdCAoSUQgaW50ZWdlciwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKElkIGludGVnZXIsIE5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOYW1lIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKFtJZF0gaW50ZWdlciwgW05hbWVdIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiW0lkXSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJbTmFtZV0iKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSBjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIG9yZyAoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgZW1wIChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHZhcmNoYXIoMjApLCAiICsKLQkJCQkib3JnX2lkIGludGVnZXIgcmVmZXJlbmNlcyB4cmVmX3Rlc3QxLi5vcmcoaWQpKSIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlDYXRhbG9nIGNhdGFsb2cxID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgieHJlZl90ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cxKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSBjYXRhbG9nMS5nZXRTY2hlbWFOYW1lZCgiZGJvIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJvcmciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInhyZWZfdGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gY2F0YWxvZzIuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZm9yZWlnbktleXMoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIm9yZyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5jb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmNvbHVtblBhaXJzKCkubmV4dCgpOwotCQlDb2x1bW4gYmFzZUNvbHVtbiA9IGNwLmdldEJhc2VDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmdfaWQiLCBiYXNlQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiByZWZDb2x1bW4gPSBjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCByZWZDb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgZW1wIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBvcmciKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3NDRlNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9nZW4vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU5ZmViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWI5MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEp1bCAwNyAyMDoxMzoyNCBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmU0NDVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iMS4yLjAiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iMS4xLjEiLAotIG9yZy5lY2xpcHNlLmpwdC5nZW47YnVuZGxlLXZlcnNpb249IjEuMS4wIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4yIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4ZDRiZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjlhNWRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotIyAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0jICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9FbnRpdHlHZW5Ub29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9FbnRpdHlHZW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMGJhOTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQuRW50aXR5R2VuVG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVudGl0eUdlblRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW50aXR5R2VuVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lMSgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIjVvbyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTIoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIjVPTyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTMoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIjVPTyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTQoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9mb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lNSgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQluYW1lcy5hZGQoIkZvb0JhciIpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9mb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTEoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNW9vIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTIoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lMygpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQluYW1lcy5hZGQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjVPTyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWU0KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lNSgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQluYW1lcy5hZGQoIkZvb0JhciIpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb29fYmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0Jhcl8iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9mb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRHZW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vdGVzdHMvaW50ZXJuYWwvSnB0R2VuVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3OWQ3ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRHZW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLmludGVybmFsLkVudGl0eUdlblRvb2xzVGVzdHM7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRHZW5UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkpQVCBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnRpdHlHZW5Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0R2VuVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvdGVzdC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMzExYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJnZW4tdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMuaW50ZXJuYWwuSnB0R2VuVGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iIi8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCwgc3VpdGUsIGNsZWFudXAiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwODc3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQwNzc0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NGEwZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6Mjc6MTYgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzg2ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMQotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5qdW5pdDQ7YnVuZGxlLXZlcnNpb249IjQuMy4xIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC51aSwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iMy4zLjEwMCIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuamZhY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQyZTRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4YWI4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotIyAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0jICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVUkgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGFiYjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybS5KcHRVaVBsYXRmb3JtVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dC5KcHRVaVNXVFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsLkpwdFVpVXRpbFRlc3RzOwotCi0vKioKLSAqIFJ1bnMgYWxsIEpQVCBVSSBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VWlUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVaVBsYXRmb3JtVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlTV1RUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVaVV0aWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFjZTNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZTsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+IHNlbGVjdGVkVmVoaWNsZTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnNlbGVjdGVkVmVoaWNsZSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4oKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgNDAwKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRUcmVlUGFuZWwobWFpblBhbmVsKTsKLQkJYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbGFiZWwuc2V0VGV4dCgiTXkgVmVoaWNsZXMiKTsKLQkJCi0JCXRyZWUgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlciA9IAotCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IFZlaGljbGVDb250ZW50UHJvdmlkZXJGYWN0b3J5KCksCi0JCQkJbmV3IFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQkJdHJlZS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIoY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldElucHV0KG5ldyBSb290KCkpOwotCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2VsZWN0ZWRWZWhpY2xlLnNldFZhbHVlKChWZWhpY2xlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRVcHBlckNvbnRyb2xQYW5lbChwYW5lbCk7Ci0JCWJ1aWxkTG93ZXJDb250cm9sUGFuZWwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRVcHBlckNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJYnVpbGRWZWhpY2xlQ29tYm8ocGFuZWwpOwotCQlidWlsZENvbG9yQ29tYm8ocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRWZWhpY2xlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21ib1ZpZXdlciBjb21ibyA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY29tYm8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0TGFiZWxQcm92aWRlcihuZXcgVmVoaWNsZVR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRJbnB1dCgKLQkJCW5ldyBWZWhpY2xlVHlwZVtdIHsKLQkJCQlWZWhpY2xlVHlwZS5CSUNZQ0xFLCBWZWhpY2xlVHlwZS5DQVIsIAotCQkJCVZlaGljbGVUeXBlLlRSVUNLLCBWZWhpY2xlVHlwZS5CT0FUCi0JCQl9KTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0VmVoaWNsZVR5cGUoKFZlaGljbGVUeXBlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7IAotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigodmVoaWNsZSA9PSBudWxsKSA/IG51bGwgOiB2ZWhpY2xlLnZlaGljbGVUeXBlKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29sb3JDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbWJvVmlld2VyIGNvbWJvID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljb21iby5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2xvckxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldElucHV0KG5ldyBDb2xvcltdIHtDb2xvci5SRUQsIENvbG9yLkJMVUUsIENvbG9yLllFTExPVywgQ29sb3IuR1JFRU59KTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0Q29sb3IoKENvbG9yKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7IAotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigodmVoaWNsZSA9PSBudWxsKSA/IG51bGwgOiB2ZWhpY2xlLmNvbG9yKCkpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTG93ZXJDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlidWlsZEVmZmVjdHNMYWJlbChwYW5lbCk7Ci0JCWJ1aWxkR3JleWVkQ2hlY2tCb3gocGFuZWwpOwotCQlidWlsZFRyYW5zbHVjZW50Q2hlY2tCb3gocGFuZWwpOwotCQlidWlsZEFjdGlvblBhbmVsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRWZmZWN0c0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoIkNvbG9yIGVmZmVjdHM6ICIpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAzLCAxKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEdyZXllZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlidXR0b24uc2V0VGV4dCgiZ3JleWVkIik7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRHcmV5ZWQoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24odmVoaWNsZSAhPSBudWxsICYmIHZlaGljbGUuaXNHcmV5ZWQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRyYW5zbHVjZW50Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJYnV0dG9uLnNldFRleHQoInRyYW5zbHVjZW50Iik7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRUcmFuc2x1Y2VudChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJYnV0dG9uLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbih2ZWhpY2xlICE9IG51bGwgJiYgdmVoaWNsZS5pc1RyYW5zbHVjZW50KCkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRBY3Rpb25QYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRSZWZyZXNoVHJlZUFDSSgpLmZpbGwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZWZyZXNoVHJlZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlZnJlc2ggdHJlZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hUcmVlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVmcmVzaCB0aGUgdHJlZSdzIGxhYmVscyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0JCi0Jdm9pZCByZWZyZXNoVHJlZSgpIHsKLQkJdHJlZS5yZWZyZXNoKCk7Ci0JfQotCQotCXByaXZhdGUgVmVoaWNsZSBzZWxlY3RlZFZlaGljbGUoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFZlaGljbGUuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZVR5cGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChWZWhpY2xlVHlwZSkgZWxlbWVudCkuZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2xvckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbG9yKSBlbGVtZW50KS5kZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVDb250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUm9vdCkgewotCQkJCXJldHVybiBuZXcgUm9vdENvbnRlbnRQcm92aWRlcigKLQkJCQkJKFJvb3QpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFZlaGljbGVDb250ZW50UHJvdmlkZXIoCi0JCQkJKFZlaGljbGUpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdENvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8VmVoaWNsZT4KLQl7Ci0JCXB1YmxpYyBSb290Q29udGVudFByb3ZpZGVyKFJvb3QgaXRlbSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFJvb3QgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFJvb3QpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFZlaGljbGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8VmVoaWNsZT4odGhpcy5nZXRNb2RlbCgpLnZlaGljbGVzKCkpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmVoaWNsZUNvbnRlbnRQcm92aWRlcihWZWhpY2xlIGl0ZW0sIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBWZWhpY2xlIGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChWZWhpY2xlKSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5wYXJlbnQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbCBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbCgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGVsZW1lbnQsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gbmV3IFZlaGljbGVMYWJlbFByb3ZpZGVyKChWZWhpY2xlKSBlbGVtZW50LCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWZWhpY2xlTGFiZWxQcm92aWRlcihWZWhpY2xlIHZlaGljbGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih2ZWhpY2xlLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlaGljbGUsIEltYWdlPigKLQkJCQkJbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigoVmVoaWNsZSkgbW9kZWwoKSksIAotCQkJCQlWZWhpY2xlLkNPTE9SX1BST1BFUlRZLCBWZWhpY2xlLkdSRVlFRF9QUk9QRVJUWSwgVmVoaWNsZS5UUkFOU0xVQ0VOVF9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuaW1hZ2UoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVoaWNsZSwgU3RyaW5nPigKLQkJCQkJbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigoVmVoaWNsZSkgbW9kZWwoKSksIAotCQkJCQlWZWhpY2xlLlZFSElDTEVfVFlQRV9QUk9QRVJUWSwgVmVoaWNsZS5DT0xPUl9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmNvbG9yKCkuZGVzY3JpcHRpb24oKSArICcgJyArIHN1YmplY3QudmVoaWNsZVR5cGUoKS5kZXNjcmlwdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQkJcmV0dXJuIGJ1aWxkVGV4dE1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JewotCQlwcml2YXRlIFRyZWVOb2RlIHBhcmVudDsKLQkJCi0JCQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBUcmVlTm9kZSBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHJvdGVjdGVkIGZpbmFsIFZlaGljbGVbXSB2ZWhpY2xlczsKLQkJCi0JCQotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwpOwotCQkJdmVoaWNsZXMgPSBuZXcgVmVoaWNsZVtdIHsKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5CSUNZQ0xFLCBDb2xvci5CTFVFKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5DQVIsIENvbG9yLllFTExPVyksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuVFJVQ0ssIENvbG9yLlJFRCksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQk9BVCwgQ29sb3IuR1JFRU4pfTsKLQkJfQotCQkKLQkJcHVibGljIFZlaGljbGVbXSB2ZWhpY2xlcygpIHsKLQkJCXJldHVybiB2ZWhpY2xlczsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlIGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXByaXZhdGUgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFSElDTEVfVFlQRV9QUk9QRVJUWSA9ICJ2ZWhpY2xlVHlwZSI7Ci0JCQotCQlwcml2YXRlIENvbG9yIGNvbG9yOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gZ3JleWVkID0gZmFsc2U7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdSRVlFRF9QUk9QRVJUWSA9ICJncmV5ZWQiOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHRyYW5zbHVjZW50ID0gZmFsc2U7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQU5TTFVDRU5UX1BST1BFUlRZID0gInRyYW5zbHVjZW50IjsKLQkJCi0JCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0JCQotCQkJCi0JCXB1YmxpYyBWZWhpY2xlKFRyZWVOb2RlIHBhcmVudCwgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGUsIENvbG9yIGNvbG9yKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJdGhpcy52ZWhpY2xlVHlwZSA9IHZlaGljbGVUeXBlOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gdmVoaWNsZVR5cGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlaGljbGVUeXBlKFZlaGljbGVUeXBlIG5ld1ZlaGljbGVUeXBlKSB7Ci0JCQlWZWhpY2xlVHlwZSBvbGRWZWhpY2xlVHlwZSA9IHZlaGljbGVUeXBlOwotCQkJdmVoaWNsZVR5cGUgPSBuZXdWZWhpY2xlVHlwZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkVISUNMRV9UWVBFX1BST1BFUlRZLCBvbGRWZWhpY2xlVHlwZSwgbmV3VmVoaWNsZVR5cGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ29sb3IgY29sb3IoKSB7Ci0JCQlyZXR1cm4gY29sb3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIG5ld0NvbG9yKSB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNvbG9yOwotCQkJY29sb3IgPSBuZXdDb2xvcjsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZENvbG9yLCBuZXdDb2xvcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzR3JleWVkKCkgewotCQkJcmV0dXJuIGdyZXllZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0R3JleWVkKGJvb2xlYW4gbmV3R3JleWVkKSB7Ci0JCQlib29sZWFuIG9sZEdyZXllZCA9IGdyZXllZDsKLQkJCWdyZXllZCA9IG5ld0dyZXllZDsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR1JFWUVEX1BST1BFUlRZLCBvbGRHcmV5ZWQsIG5ld0dyZXllZCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVHJhbnNsdWNlbnQoKSB7Ci0JCQlyZXR1cm4gdHJhbnNsdWNlbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRyYW5zbHVjZW50KGJvb2xlYW4gbmV3VHJhbnNsdWNlbnQpIHsKLQkJCWJvb2xlYW4gb2xkVHJhbnNsdWNlbnQgPSB0cmFuc2x1Y2VudDsKLQkJCXRyYW5zbHVjZW50ID0gbmV3VHJhbnNsdWNlbnQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TTFVDRU5UX1BST1BFUlRZLCBvbGRUcmFuc2x1Y2VudCwgbmV3VHJhbnNsdWNlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgaW1hZ2UoKSB7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEltYWdlRmFjdG9yeS5pbWFnZShjb2xvcigpLCBncmV5ZWQsIHRyYW5zbHVjZW50KTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBlbnVtIFZlaGljbGVUeXBlCi0JewotCQlCSUNZQ0xFKCJiaWN5Y2xlIiksCi0JCUNBUigiY2FyIiksCi0JCVRSVUNLKCJ0cnVjayIpLAotCQlCT0FUKCJib2F0Iik7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCi0JCXByaXZhdGUgVmVoaWNsZVR5cGUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZW51bSBDb2xvcgotCXsKLQkJUkVEKCJyZWQiLCBuZXcgUkdCKDI1NSwgMCwgMCkpLAotCQlCTFVFKCJibHVlIiwgbmV3IFJHQigwLCAwLCAyNTUpKSwKLQkJWUVMTE9XKCJ5ZWxsb3ciLCBuZXcgUkdCKDI1NSwgMjU1LCAwKSksCi0JCUdSRUVOKCJncmVlbiIsIG5ldyBSR0IoMCwgMjU1LCAwKSk7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgUkdCIHJnYjsKLQkJCi0JCXByaXZhdGUgQ29sb3IoU3RyaW5nIGRlc2NyaXB0aW9uLCBSR0IgcmdiKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl0aGlzLnJnYiA9IHJnYjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFJHQiByZ2IoKSB7Ci0JCQlyZXR1cm4gcmdiOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlRmFjdG9yeQotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgUkdCIHJnYihDb2xvciBjb2xvciwgYm9vbGVhbiBncmV5ZWQsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKLQkJCVJHQiByZ2IgPSAoZ3JleWVkKSA/IG5ldyBSR0IoMTI3LCAxMjcsIDEyNykgOiBjb2xvci5yZ2IoKTsKLQkJCWlmICh0cmFuc2x1Y2VudCkgewotCQkJCXJnYiA9IG5ldyBSR0IodHJhbnNsdWNpZnkocmdiLnJlZCksIHRyYW5zbHVjaWZ5KHJnYi5ncmVlbiksIHRyYW5zbHVjaWZ5KHJnYi5ibHVlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmdiOwotCQl9Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsdWNpZnkoaW50IGNvbG9yKSB7Ci0JCQlyZXR1cm4gMjU1IC0gKGludCkgKCgyNTUgLSBjb2xvcikgKiAwLjMpOwotCQl9Ci0JCQotCQlwdWJsaWMgc3RhdGljIEltYWdlIGltYWdlKENvbG9yIGNvbG9yLCBib29sZWFuIGdyZXllZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgewotCQkJUGFsZXR0ZURhdGEgcGQgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtyZ2IoY29sb3IsIGdyZXllZCwgdHJhbnNsdWNlbnQpfSk7Ci0JCQlJbWFnZURhdGEgaWQgPSBuZXcgSW1hZ2VEYXRhKDIwLCAyMCwgMSwgcGQpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCAyMDsgeCArKykgewotCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgMjA7IHkgKyspIHsKLQkJCQkJaWQuc2V0UGl4ZWwoeCwgeSwgMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgaWQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhYzY3MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgUm9vdCByb290OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZT4gc2VsZWN0ZWROb2RlOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIGNvbnRyb2xUcmVlOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdUcmVlOwotCi0JcHJpdmF0ZSBUZXh0IG5vZGVOYW1lVGV4dDsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlXaW5kb3cgd2luZG93ID0gbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnJvb3QgPSBuZXcgUm9vdCgpOwotCQl0aGlzLnJvb3QuYWRkQ2hpbGQoIlBhcmVudF8xIik7Ci0JCXRoaXMuc2VsZWN0ZWROb2RlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZT4odGhpcy5yb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCA0MDApOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFRyZWVQYW5lbChtYWluUGFuZWwpOwotCQlidWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlidWlsZENvbnRyb2xUcmVlUGFuZWwocGFuZWwpOwotCQlidWlsZFZpZXdUcmVlUGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250cm9sVHJlZSA9IGJ1aWxkVHJlZVBhbmVsKAotCQkJCXBhcmVudCwgIkNvbnRyb2wgdHJlZSIsCi0JCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIobmV3IENvbnRyb2xUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSksCi0JCQkJbmV3IExhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbnRyb2xUcmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWNvbnRyb2xUcmVlLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihldmVudC5nZXROZXdWYWx1ZSgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFZpZXdUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl2aWV3VHJlZSA9IGJ1aWxkVHJlZVBhbmVsKAotCQkJCXBhcmVudCwgIlZpZXcgdHJlZSIsCi0JCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIobmV3IFZpZXdUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSksCi0JCQkJbmV3IExhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCi0JCWZpbmFsIFRyZWVWaWV3ZXIgdHJlZSA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXRyZWUuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdHJlZS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldElucHV0KHJvb3QpOwotCi0JCXJldHVybiB0cmVlOwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU5vZGUgc2VsZWN0aW9uID0gKFRyZWVOb2RlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJc2VsZWN0ZWROb2RlLnNldFZhbHVlKChzZWxlY3Rpb24gPT0gbnVsbCkgPyByb290IDogc2VsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNiwgZmFsc2UpKTsKLQkJYnVpbGROb2RlTmFtZVRleHQocGFuZWwpOwotCQlidWlsZEFkZENoaWxkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkQWRkTmVzdGVkQ2hpbGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRSZW1vdmVBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm9kZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbm9kZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCW5vZGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkQ2hpbGRBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJBZGQgY2hpbGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGRDaGlsZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkFkZCBhIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUiKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoKChUcmVlTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuY2FuSGF2ZUNoaWxkcmVuKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkTmVzdGVkQ2hpbGRBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJBZGQgbmVzdGVkIGNoaWxkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkTmVzdGVkQ2hpbGQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJBZGQgYSBuZXN0ZWQgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSIpOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKCgoVHJlZU5vZGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZUFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlbW92ZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlbW92ZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlbW92ZSB0aGUgc2VsZWN0ZWQgbm9kZSIpOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGV2ZW50LmdldE5ld1ZhbHVlKCkgIT0gcm9vdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQ2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQ2xlYXIgdGhlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZXN0b3JlIHRoZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGFkZENoaWxkKCkgewotCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlTmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAobm9kZU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJc2VsZWN0ZWROb2RlLmdldFZhbHVlKCkuYWRkQ2hpbGQobm9kZU5hbWUpOwotCQl9Ci0JfQotCi0Jdm9pZCBhZGROZXN0ZWRDaGlsZCgpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZU5hbWVUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5vZGVOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCXNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpLmFkZE5lc3RlZENoaWxkKG5vZGVOYW1lKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlKCkgewotCQlUcmVlTm9kZSBub2RlID0gc2VsZWN0ZWROb2RlLmdldFZhbHVlKCk7Ci0JCW5vZGUucGFyZW50KCkucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQljb250cm9sVHJlZS5zZXRJbnB1dChudWxsKTsKLQkJdmlld1RyZWUuc2V0SW5wdXQobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCWNvbnRyb2xUcmVlLnNldElucHV0KHJvb3QpOwotCQl2aWV3VHJlZS5zZXRJbnB1dChyb290KTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJKFRyZWVOb2RlKSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IFZpZXdUcmVlUGFyZW50SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCShQYXJlbnQpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxUcmVlTm9kZT4KLQl7Ci0JCXB1YmxpYyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJVHJlZU5vZGUgdHJlZU5vZGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih0cmVlTm9kZSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBUcmVlTm9kZSB0cmVlTm9kZSgpIHsKLQkJCXJldHVybiAoVHJlZU5vZGUpIGdldE1vZGVsKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0cmVlTm9kZSgpLnBhcmVudCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIHRyZWVOb2RlKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdHJlZU5vZGUoKS5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVRyZWVOb2RlIHRyZWVOb2RlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodHJlZU5vZGUsIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCVRyZWVOb2RlIHBhcmVudCA9IHN1cGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGUsIFRyZWVOb2RlPihzdXBlci5idWlsZENoaWxkcmVuTW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IHRyYW5zZm9ybShUcmVlTm9kZSB2YWx1ZSkgewotCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQkJCQkJZmluYWwgTmVzdCBuZXN0ID0gKE5lc3QpIHZhbHVlOwotCQkJCQkJCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGU+KAotCQkJCQkJCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIG5lc3QpIHsKLQkJCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gbmVzdC5jaGlsZHJlbigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odmFsdWUpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFRyZWVOb2RlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGNoaWxkcmVuOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSElMRFJFTl9MSVNUID0gImNoaWxkcmVuIjsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxUcmVlTm9kZT4oY2hpbGRyZW4pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKGludCBpbmRleCkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCW5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgUGFyZW50KHRoaXMsIG5hbWUpKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyZW50IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXB1YmxpYyBQYXJlbnQoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IENoaWxkKHRoaXMsIG5hbWUpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlTmVzdGVkQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGROZXN0ZWRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJVHJlZU5vZGUgbmVzdCA9IG5ldyBOZXN0KHRoaXMpOwotCQkJYWRkQ2hpbGQobmVzdCk7Ci0JCQluZXN0LmFkZENoaWxkKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPENoaWxkPiBuZXN0bGVzc0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxDaGlsZCwgQ2hpbGQ+KAotCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUcmVlTm9kZSwgQ2hpbGQ+KGNoaWxkcmVuKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENoaWxkIHRyYW5zZm9ybShUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCXJldHVybiAoKE5lc3QpIG5leHQpLmNoaWxkKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiAoQ2hpbGQpIG5leHQ7Ci0JCQkJCQl9Ci0JCQkJCX0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQ2hpbGQgYykgewotCQkJCQlyZXR1cm4gYyAhPSBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIE5lc3QoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsICJuZXN0Iik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKSA9PSAwOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJLyogY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQgKi8KLQkJcHVibGljIENoaWxkIGNoaWxkKCkgewotCQkJcmV0dXJuIChjaGlsZHJlbi5pc0VtcHR5KCkpID8gbnVsbCA6IChDaGlsZCkgY2hpbGRyZW4uZ2V0KDApOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGlsZCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgQ2hpbGQoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiZWZlMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCB0ZXN0UHJvamVjdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJFeHRlbnNpb25UZXN0UHJvamVjdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImV4dGVuc2lvbi50ZXN0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0NMQVNTID0gRXh0ZW5zaW9uVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fSUQgPSBFeHRlbnNpb25UZXN0UGx1Z2luLlBMVUdJTl9JRDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fSUQgPSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5JRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0NMQVNTID0gVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fTEFCRUwgPSAiVGVzdCBKcGEgUGxhdGZvcm0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9VSV9QTEFURk9STV9JRCA9IFRFU1RfUExBVEZPUk1fSUQ7Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdFByb2plY3QgPSB0aGlzLmJ1aWxkSnBhUHJvamVjdChQUk9KRUNUX05BTUUsIGZhbHNlKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCXRoaXMudGVzdFByb2plY3QgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnRlc3RQcm9qZWN0LmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SnBhUGxhdGZvcm0oKSB7Ci0JCWFzc2VydE5vdE51bGwoSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtKHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmNjOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdFVpUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlQbGF0Zm9ybVRlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFVpUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpUGxhdGZvcm1UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQxMmVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcjsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFbXB0eUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlwb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE1vZGVsLCBTaW1wbGVEaXNwbGF5YWJsZT4oc3ViamVjdEhvbGRlciwgTW9kZWwuSVRFTVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lml0ZW1zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pdGVtc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGJ1aWxkU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TW9kZWwsIFNpbXBsZURpc3BsYXlhYmxlPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5JVEVNX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTaW1wbGVEaXNwbGF5YWJsZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJdGVtKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFNpbXBsZURpc3BsYXlhYmxlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRJdGVtKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQ29udmVydGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U2ltcGxlRGlzcGxheWFibGU+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU2ltcGxlRGlzcGxheWFibGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS5kaXNwbGF5U3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4oKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGl0ZW1Db3VudHMoKTsKLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTaW1wbGVEaXNwbGF5YWJsZT4gYykgewotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImZvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmF6IikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamF6IikpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gc2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCW1vZGVsICAgICAgICAgICAgICA9IG5ldyBNb2RlbCgpOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQkJc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU2hlbGwgc2hlbGwoKSB7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IHN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBzdWJqZWN0SG9sZGVyOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IG51bGw7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RJdGVtcygpIHsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGNvdW50IG9mIGl0ZW1zIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIG1vZGVsIiwKLQkJCW1vZGVsLml0ZW1zU2l6ZSgpLAotCQkJaXRlbUNvdW50cygpCi0JCSk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1vZGVsLml0ZW1zU2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBpdGVtIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbm90IHRoZSBzYW1lIGJldHdlZW4gdGhlIG1vZGVsIGFuZCB0aGUgY29tYm8iLAotCQkJCW1vZGVsLml0ZW1BdChpbmRleCkuZGlzcGxheVN0cmluZygpLAotCQkJCWl0ZW1BdChpbmRleCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFJlbW92ZUl0ZW1zX0FkZGVkQWZ0ZXIoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQWZ0ZXJfUmVtb3ZlSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFJlbW92ZUl0ZW1zX0FkZGVkQWZ0ZXIoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQmVmb3JlX1JlbW92ZUl0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRCZWZvcmVfUmVtb3ZlSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJBZnRlcl9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJBZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJCZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNCZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNCZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX1NlbGVjdGVkSXRlbUNoYW5nZWRfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQotCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBhZGFwdGVyID0gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gYnVpbGRTZWxlY3RlZEl0ZW0oKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBidWlsZFNlbGVjdGVkSXRlbSgpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX1NlbGVjdGVkSXRlbUNoYW5nZWRfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDMpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBhZGFwdGVyID0gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3ROdWxsU3ViamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwgc2VsZWN0ZWRJdGVtSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShidWlsZFNlbGVjdGVkSXRlbSgpKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQkvLyBOdWxsIGJlY2F1c2UgdGhlIHN1YmplY3QgaG9sZGVyIGRvZXNuJ3QgaGF2ZSB0aGUgc3ViamVjdCBzZXQKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0FkZGVkQWZ0ZXIoKSB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFNlbGVjdGVkSXRlbShTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0pIHsKLQotCQlpZiAoc2VsZWN0ZWRJdGVtID09IG51bGwpIHsKLQotCQkJYXNzZXJ0TnVsbCgKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgbnVsbCIsCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBjb21ibydzIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLAotCQkJCSIiLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpKSB7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbSwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsCi0JCQkJIiIsCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCQllbHNlIHsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLmRpc3BsYXlTdHJpbmcoKSwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKFNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQotCQkvLyBUZXN0IDEKLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDIKLQkJc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDEpOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAzCi0JCXNlbGVjdGVkSXRlbSA9IG51bGw7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAzCi0JCXNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgyKTsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBpdGVtOwotCQlwcml2YXRlIExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJcHJpdmF0ZSBib29sZWFuIHNldEl0ZW1DYWxsZWQ7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1BST1BFUlRZID0gIml0ZW0iOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1TX0xJU1QgPSAiaXRlbXMiOwotCi0JCXZvaWQgYWRkSXRlbXMoSXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlhZGRJdGVtc1RvTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIGFkZEl0ZW1zKExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlhZGRJdGVtc1RvTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFySXRlbUNhbGxlZEZsYWcoKSB7Ci0JCQlzZXRJdGVtQ2FsbGVkID0gZmFsc2U7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBnZXRJdGVtKCkgewotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0SXRlbUNhbGxlZCgpIHsKLQkJCXJldHVybiBzZXRJdGVtQ2FsbGVkOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgaXRlbUF0KGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuaXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCi0JCUxpc3RJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMoKSB7Ci0JCQlyZXR1cm4gaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQotCQlpbnQgaXRlbXNTaXplKCkgewotCQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlSXRlbXMoSXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgc2V0SXRlbShTaW1wbGVEaXNwbGF5YWJsZSBpdGVtKSB7Ci0JCQlzZXRJdGVtQ2FsbGVkID0gdHJ1ZTsKLQotCQkJU2ltcGxlRGlzcGxheWFibGUgb2xkSXRlbSA9IHRoaXMuaXRlbTsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElURU1fUFJPUEVSVFksIG9sZEl0ZW0sIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPFNpbXBsZURpc3BsYXlhYmxlPiB7Ci0KLQkJcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBpdGVtOwotCQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJOb3RpZmllZDsKLQotCQl2b2lkIGNsZWFySW5mbygpIHsKLQkJCXRoaXMubGlzdGVuZXJOb3RpZmllZCA9IGZhbHNlOwotCQkJdGhpcy5pdGVtID0gbnVsbDsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGdldEl0ZW0oKSB7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJOb3RpZmllZCgpIHsKLQkJCXJldHVybiBsaXN0ZW5lck5vdGlmaWVkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxTaW1wbGVEaXNwbGF5YWJsZT4gZSkgewotCQkJbGlzdGVuZXJOb3RpZmllZCA9IHRydWU7Ci0JCQlpdGVtID0gZS5zZWxlY3RlZEl0ZW0oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjE0M2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLQotcHVibGljIGNsYXNzIENDb21ib01vZGVsQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsKCksIFNXVC5OVUxMKTsKLQotCQlyZXR1cm4gQ0NvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsKCksIFNXVC5SRUFEX09OTFkpOwotCi0JCXJldHVybiBDQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJY29tYm8sCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb21ib1NlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldFRleHQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGl0ZW1Db3VudHMoKSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQljb21ibyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjE1MmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21ib01vZGVsQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCXByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULk5VTEwpOwotCQllZGl0YWJsZSA9IHRydWU7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULlJFQURfT05MWSk7Ci0JCWVkaXRhYmxlID0gZmFsc2U7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBjb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgaXRlbUNvdW50cygpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE4YzJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1AU3VpdGVDbGFzc2VzCi0oewotCUNDb21ib01vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCVRhYmxlTW9kZWxBZGFwdGVyVGVzdC5jbGFzcwotfSkKLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotcHVibGljIGZpbmFsIGNsYXNzIEpwdFVpU1dUVGVzdHMgewotCi0JcHJpdmF0ZSBKcHRVaVNXVFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSlVuaXQ0VGVzdEFkYXB0ZXIoSnB0VWlTV1RUZXN0cy5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE2MjlmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TW9kZWwsIEludGVnZXI+KHN1YmplY3RIb2xkZXIsIE1vZGVsLlZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQltb2RlbCAgICAgICAgICAgICAgPSBuZXcgTW9kZWwoKTsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpc3Bvc2VkKCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBtb2RlbCdzIHZhbHVlIiwKLQkJCW1vZGVsLmdldFZhbHVlKCksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBtb2RlbAotCQlzcGlubmVyLmRpc3Bvc2UoKTsKLQotCQl2YWx1ZSA9IDQ7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG1vZGVsJ3MgdmFsdWUgd2FzIHNvbWVob3cgY2hhbmdlZCIsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzEoKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMigpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8zKCkgewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl80KCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgdmFsdWUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSAiICsgdmFsdWUsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDaGFuZ2VkKCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBtb2RlbCdzIHZhbHVlIiwKLQkJCW1vZGVsLmdldFZhbHVlKCksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBtb2RlbAotCQl2YWx1ZSA9IDQ7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc29tZWhvdyBjaGFuZ2VkIiwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQltb2RlbC5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzcGlubmVyCi0JCXZhbHVlID0gNjsKLQkJc3Bpbm5lci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbmV3IHZhbHVlIHNldCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG1vZGVsJ3MgdmFsdWUgd2FzIHN1cHBvc2VkIHRvIGJlIHVwZGF0ZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBEaXNjb25uZWN0IGZyb20gbW9kZWwKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNldFZhbHVlQ2FsbGVkOwotCQlwcml2YXRlIEludGVnZXIgdmFsdWU7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7Ci0KLQkJdm9pZCBjbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gZmFsc2U7Ci0JCX0KLQotCQlJbnRlZ2VyIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1NldFZhbHVlQ2FsbGVkKCkgewotCQkJcmV0dXJuIHNldFZhbHVlQ2FsbGVkOwotCQl9Ci0KLQkJdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQlzZXRWYWx1ZUNhbGxlZCA9IHRydWU7Ci0KLQkJCUludGVnZXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIHZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTdiOGI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVDb2x1bW5BZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUhvbGRlcnMoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TWFuYWdlciwgRW1wbG95ZWU+KHN1YmplY3RIb2xkZXIsIE1hbmFnZXIuRU1QTE9ZRUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFbXBsb3llZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5lbXBsb3llZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RW1wbG95ZWU+IGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoZmluYWwgQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RW1wbG95ZWU+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFbXBsb3llZT4gZSkgewotCQkJCWVtcGxveWVlcy5jbGVhcigpOwotCQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZW1wbG95ZWVzLCBlLnNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4oKTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzaGVsbCAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJc3ViamVjdEhvbGRlciA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXNoZWxsICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCW5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgVGFibGUgd2FzIHBvcHVsYXRlZAotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbXMgc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSBsaXN0IG9mIEVtcGxveWVlcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQltYW5hZ2VyLmNoYW5nZUVtcGxveWVlcyhlbXBsb3llZXMpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMCwgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMSwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMiwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENsZWFyZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHRoZW0gYWxsCi0JCW1hbmFnZXIucmVtb3ZlQWxsRW1wbG95ZWVzKCk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGxpc3QgaG9sZGVyIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCIsIDAsIGxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIFRhYmxlIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCIsIDAsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgsIGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRNYW5hZ2VyLCBleHBlY3RlZFRpdGxlKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBFbXBsb3llZXMgd2VyZSBhZGRlZCB0byB0aGUgVGFibGUKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSB1cCB0aGUgbGlzdAotCQltYW5hZ2VyLm1vdmVFbXBsb3llZVVwKGVtcGxveWVlMik7Ci0KLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4MSk7Ci0KLQkJaW50IGluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4Mik7Ci0KLQkJaW50IGluZGV4MyA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBzaG91bGQgbm90IGhhdmUgYmVlbiBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleDMpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSBkb3duIHRoZSBsaXN0Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlRG93bihlbXBsb3llZTEpOwotCi0JCWluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBzaG91bGQgbm90IGhhdmUgYmVlbiBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleDEpOwotCi0JCWluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4Mik7Ci0KLQkJaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgzKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lICAgID0gIkRhbGkiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyID0gIldUUCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlICAgPSAicGx1Zy1pbiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRUaXRsZSwgZXhwZWN0ZWRNYW5hZ2VyKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNYWtlIHN1cmUgaXQgd2FzIGFkZGVkIHRvIHRoZSBtb2RlbAotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgsIGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRNYW5hZ2VyLCBleHBlY3RlZFRpdGxlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCS8vIE5vdyB0ZXN0IHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZShlbXBsb3llZSk7Ci0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIHdhcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZSBtb2RlbCIsIC0xLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAwIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZTEpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQotCQkvLyBSZXBsYWNlIHRoZSBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJbWFuYWdlci5yZXBsYWNlKGVtcGxveWVlMSwgZW1wbG95ZWUyKTsKLQotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRTYW1lKCJUaGUgRW1wbG95ZWUgdGhhdCBnb3QgcmVwbGFjZWQgc2hvdWxkIGJlIGF0IGluZGV4ICIgKyBpbmRleDEsIGluZGV4MSwgaW5kZXgyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zQWRkZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbXMgcmVwcmVzZW50aW5nIHRoZSBlbXBsb3llZXMKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCi0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgpOwotCi0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgVGFibGVJdGVtIHdhcyBjb3JyZWN0bHkgcG9wdWxhdGVkCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAwLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAxLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAyLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNNb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU0ICAgID0gIkRhbGlfNCI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI0ID0gIldUUF80IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU0ICAgPSAicGx1Zy1pbl80IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNSAgICA9ICJEYWxpXzUiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNSA9ICJXVFBfNSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNSAgID0gInBsdWctaW5fNSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTYgICAgPSAiRGFsaV82IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjYgPSAiV1RQXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTYgICA9ICJwbHVnLWluXzYiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNCA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU0LCBleHBlY3RlZFRpdGxlNCwgZXhwZWN0ZWRNYW5hZ2VyNCk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU1LCBleHBlY3RlZFRpdGxlNSwgZXhwZWN0ZWRNYW5hZ2VyNSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU2LCBleHBlY3RlZFRpdGxlNiwgZXhwZWN0ZWRNYW5hZ2VyNik7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTQpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU2KTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgNiIsIDYsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTQpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNSk7Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlcyhlbXBsb3llZXMsIDApOwotCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJaW50IGluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCWludCBpbmRleDQgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU0KTsKLQkJaW50IGluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbnQgaW5kZXg2ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNik7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDMsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA0LCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMCwgaW5kZXgzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDQgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDEsIGluZGV4NCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA1IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAyLCBpbmRleDUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNSwgaW5kZXg2KTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg0LCBleHBlY3RlZE5hbWU0LCBleHBlY3RlZE1hbmFnZXI0LCBleHBlY3RlZFRpdGxlNCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDUsIGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkTWFuYWdlcjUsIGV4cGVjdGVkVGl0bGU1KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NiwgZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRNYW5hZ2VyNiwgZXhwZWN0ZWRUaXRsZTYpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgZG93biB0aGUgbGlzdAotCQllbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlcyhlbXBsb3llZXMsIDQpOwotCi0JCWluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCWluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbmRleDUgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU1KTsKLQkJaW5kZXg2ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNik7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMCwgaW5kZXgzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDQgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDEsIGluZGV4NCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA1IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAyLCBpbmRleDUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXg2KTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg0LCBleHBlY3RlZE5hbWU0LCBleHBlY3RlZE1hbmFnZXI0LCBleHBlY3RlZFRpdGxlNCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDUsIGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkTWFuYWdlcjUsIGV4cGVjdGVkVGl0bGU1KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NiwgZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRNYW5hZ2VyNiwgZXhwZWN0ZWRUaXRsZTYpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtcyByZXByZXNlbnRpbmcgdGhlIGVtcGxveWVlcwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleCk7Ci0KLQkJLy8gUmVtb3ZlIDIgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCW1hbmFnZXIucmVtb3ZlRW1wbG95ZWVzKGVtcGxveWVlcyk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lICAgID0gIkRhbGkiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyID0gIldUUCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlICAgPSAicGx1Zy1pbiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRUaXRsZSwgZXhwZWN0ZWRNYW5hZ2VyKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJLy8gTmFtZSBwcm9wZXJ0eQotCQlTdHJpbmcgYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQlleHBlY3RlZE5hbWUgPSAiSnB0IjsKLQkJZW1wbG95ZWUuc2V0TmFtZShleHBlY3RlZE5hbWUpOwotCi0JCWFjdHVhbE5hbWUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTkFNRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7Ci0KLQkJLy8gTWFuYWdlciBwcm9wZXJ0eQotCQlTdHJpbmcgYWN0dWFsTWFuYWdlciA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5NQU5BR0VSX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtNQU5BR0VSX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRNYW5hZ2VyLCBhY3R1YWxNYW5hZ2VyKTsKLQotCQlleHBlY3RlZE1hbmFnZXIgPSAiYm9zcyI7Ci0JCWVtcGxveWVlLnNldE1hbmFnZXIoZXhwZWN0ZWRNYW5hZ2VyKTsKLQotCQlhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCi0JCS8vIFRpdGxlIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0KLQkJZXhwZWN0ZWRUaXRsZSA9ICJFY2xpcHNlTGluayI7Ci0JCWVtcGxveWVlLnNldFRpdGxlKGV4cGVjdGVkVGl0bGUpOwotCi0JCWFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZEl0ZW1zQWRkZWRSZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXNIb2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVycygpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZEFsbChlbXBsb3llZXMpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMiIsIDIsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCi0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUxKTsKLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyBzZWxlY3RlZCBpdGVtcwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLnJlbW92ZShlbXBsb3llZTEpOwotCi0JCWFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMSIsIDEsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCi0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGFjdHVhbEVtcGxveWVlcy5pc0VtcHR5KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkSXRlbXNDbGVhcmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXNIb2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVycygpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZEFsbChlbXBsb3llZXMpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMiIsIDIsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCi0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUxKTsKLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGFjdHVhbEVtcGxveWVlcy5pc0VtcHR5KCkpOwotCi0JCS8vIFRlc3QgcmVtb3Zpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5jbGVhcigpOwotCi0JCWFjdHVhbEVtcGxveWVlcyA9IHRhYmxlTW9kZWwuc2VsZWN0ZWRJdGVtcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGFjdHVhbEVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgIiwgMCwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCksCi0JCQlidWlsZEVtcGxveWVlSG9sZGVyKCksCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQlDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigpOwotCQl0YWJsZU1vZGVsLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoZW1wbG95ZWVzKSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7IDAsIDIgfSk7Ci0KLQkJLy8gSXQgc2VlbXMgYSBtYW51YWwgc2VsZWN0aW9uIGRvZXNuJ3Qgc2VuZCBhbnkgc2VsZWN0aW9uIGV2ZW50Ci0JCXRhYmxlTW9kZWwudGFibGVTZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgZW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgZW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJZW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQllbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgZW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0KLQkJLy8gSXQgc2VlbXMgYSBtYW51YWwgc2VsZWN0aW9uIGRvZXNuJ3Qgc2VuZCBhbnkgc2VsZWN0aW9uIGV2ZW50Ci0JCXRhYmxlTW9kZWwudGFibGVTZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgZW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAwIiwgMCwgZW1wbG95ZWVzLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKFRhYmxlIHRhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE1hbmFnZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRpdGxlKQotCXsKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQlTdHJpbmcgYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQlTdHJpbmcgYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCi0JCVN0cmluZyBhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIFN0cmluZyBtYW5hZ2VyOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkFHRVJfUFJPUEVSVFkgPSAibWFuYWdlciI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRV9QUk9QRVJUWSA9ICJ0aXRsZSI7Ci0KLQkJRW1wbG95ZWUoU3RyaW5nIG5hbWUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1hbmFnZXIpIHsKLQkJCXN1cGVyKCk7Ci0KLQkJCXRoaXMubmFtZSAgICA9IG5hbWU7Ci0JCQl0aGlzLnRpdGxlICAgPSB0aXRsZTsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TWFuYWdlcigpIHsKLQkJCXJldHVybiBtYW5hZ2VyOwotCQl9Ci0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCVN0cmluZyBnZXRUaXRsZSgpIHsKLQkJCXJldHVybiB0aXRsZTsKLQkJfQotCi0JCXZvaWQgc2V0TWFuYWdlcihTdHJpbmcgbWFuYWdlcikgewotCQkJU3RyaW5nIG9sZE1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7Ci0JCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQU5BR0VSX1BST1BFUlRZLCBvbGRNYW5hZ2VyLCBtYW5hZ2VyKTsKLQkJfQotCi0JCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuYW1lKTsKLQkJfQotCi0JCXZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCQlTdHJpbmcgb2xkVGl0bGUgPSB0aGlzLnRpdGxlOwotCQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUSVRMRV9QUk9QRVJUWSwgb2xkVGl0bGUsIHRpdGxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgTWFuYWdlciBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgTGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QTE9ZRUVTX0xJU1QgPSAiZW1wbG95ZWVzIjsKLQotCQlNYW5hZ2VyKCkgewotCQkJc3VwZXIoKTsKLQkJCWVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KCk7Ci0JCX0KLQotCQlFbXBsb3llZSBhZGRFbXBsb3llZShFbXBsb3llZSBlbXBsb3llZSkgewotCQkJYWRkSXRlbVRvTGlzdChlbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCQlyZXR1cm4gZW1wbG95ZWU7Ci0JCX0KLQotCQlFbXBsb3llZSBhZGRFbXBsb3llZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWFuYWdlcikgewotCQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBuZXcgRW1wbG95ZWUobmFtZSwgdGl0bGUsIG1hbmFnZXIpOwotCQkJcmV0dXJuIGFkZEVtcGxveWVlKGVtcGxveWVlKTsKLQkJfQotCi0JCXZvaWQgY2hhbmdlRW1wbG95ZWVzKExpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcykgewotCQkJdGhpcy5lbXBsb3llZXMuY2xlYXIoKTsKLQkJCXRoaXMuZW1wbG95ZWVzLmFkZEFsbChlbXBsb3llZXMpOwotCQkJZmlyZUxpc3RDaGFuZ2VkKEVNUExPWUVFU19MSVNULCBlbXBsb3llZXMpOwotCQl9Ci0KLQkJTGlzdEl0ZXJhdG9yPEVtcGxveWVlPiBlbXBsb3llZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVtcGxveWVlPihlbXBsb3llZXMpOwotCQl9Ci0KLQkJaW50IGVtcGxveWVlc1NpemUoKSB7Ci0JCQlyZXR1cm4gZW1wbG95ZWVzLnNpemUoKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlRG93bihFbXBsb3llZSBlbXBsb3llZSkgewotCQkJaW50IGluZGV4ID0gZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpOwotCQkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXggKyAxLCBpbmRleCwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZXMoQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzLCBpbnQgdGFyZ2V0SW5kZXgpIHsKLQotCQkJaW50IHNvdXJjZUluZGV4ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJCWZvciAoRW1wbG95ZWUgZW1wbG95ZWUgOiBlbXBsb3llZXMpIHsKLQkJCQlzb3VyY2VJbmRleCA9IE1hdGgubWluKHNvdXJjZUluZGV4LCB0aGlzLmVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKSk7Ci0JCQl9Ci0KLQkJCW1vdmVJdGVtc0luTGlzdCgKLQkJCQl0YXJnZXRJbmRleCwKLQkJCQlzb3VyY2VJbmRleCwKLQkJCQllbXBsb3llZXMuc2l6ZSgpLAotCQkJCXRoaXMuZW1wbG95ZWVzLAotCQkJCUVNUExPWUVFU19MSVNUCi0JCQkpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVVcChFbXBsb3llZSBlbXBsb3llZSkgewotCQkJaW50IGluZGV4ID0gZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpOwotCQkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXggLSAxLCBpbmRleCwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUFsbEVtcGxveWVlcygpIHsKLQkJCWNsZWFyTGlzdChlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlRW1wbG95ZWUoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCXJlbW92ZUl0ZW1Gcm9tTGlzdChlbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUVtcGxveWVlcyhDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMpIHsKLQkJCXJlbW92ZUl0ZW1zRnJvbUxpc3QoZW1wbG95ZWVzLml0ZXJhdG9yKCksIHRoaXMuZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlcGxhY2UoRW1wbG95ZWUgb2xkRW1wbG95ZWUsIEVtcGxveWVlIG5ld0VtcGxveWVlKSB7Ci0JCQlyZXBsYWNlSXRlbUluTGlzdChvbGRFbXBsb3llZSwgbmV3RW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUNvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiB7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSAzOwotCQlzdGF0aWMgZmluYWwgaW50IE1BTkFHRVJfQ09MVU1OID0gMjsKLQkJc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVElUTEVfQ09MVU1OID0gMTsKLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNYW5hZ2VySG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLk1BTkFHRVJfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYW5hZ2VyKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE1hbmFnZXIodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUaXRsZUhvbGRlcihFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihFbXBsb3llZS5USVRMRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldFRpdGxlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldFRpdGxlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGhvbGRlcnMgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bM107Ci0JCQlob2xkZXJzW05BTUVfQ09MVU1OXSA9IGJ1aWxkTmFtZUhvbGRlcihzdWJqZWN0KTsKLQkJCWhvbGRlcnNbVElUTEVfQ09MVU1OXSA9IGJ1aWxkVGl0bGVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW01BTkFHRVJfQ09MVU1OXSA9IGJ1aWxkTWFuYWdlckhvbGRlcihzdWJqZWN0KTsKLQkJCXJldHVybiBob2xkZXJzOwotCQl9Ci0KLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoY29sdW1uSW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlFbXBsb3llZSBlbXBsb3llZSA9IChFbXBsb3llZSkgZWxlbWVudDsKLQotCQkJaWYgKGNvbHVtbkluZGV4ID09IFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTikgewotCQkJCXJldHVybiBlbXBsb3llZS5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCWlmIChjb2x1bW5JbmRleCA9PSBUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVtcGxveWVlLmdldFRpdGxlKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbXBsb3llZS5nZXRNYW5hZ2VyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTW9kZWwgZXh0ZW5kcyBUYWJsZU1vZGVsQWRhcHRlcjxFbXBsb3llZT4gewotCi0JCVRhYmxlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIsCi0JCSAgICAgICAgICAgQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCSAgICAgICAgICAgVGFibGUgdGFibGUsCi0JCSAgICAgICAgICAgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gY29sdW1uQWRhcHRlciwKLQkJICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQkJc3VwZXIobGlzdEhvbGRlciwKLQkJCSAgICAgIHNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQkgICAgICB0YWJsZSwKLQkJCSAgICAgIGNvbHVtbkFkYXB0ZXIsCi0JCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCVRhYmxlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIsCi0JCSAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgICAgICBUYWJsZSB0YWJsZSwKLQkJICAgICAgICAgICBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBjb2x1bW5BZGFwdGVyLAotCQkgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCQlzdXBlcihsaXN0SG9sZGVyLAotCQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RW1wbG95ZWU+KHNlbGVjdGVkSXRlbUhvbGRlciksCi0JCQkgICAgICB0YWJsZSwKLQkJCSAgICAgIGNvbHVtbkFkYXB0ZXIsCi0JCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRW1wbG95ZWUgaXRlbSkgewotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXMoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2VsZWN0ZWRJdGVtcygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc3VwZXIudGFibGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgxMjgwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRleHRGaWVsZE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBlbnRyeSBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIlNjb29ieSBEb28iOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGFsbENhcHNOYW1lSG9sZGVyOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoREVGQVVMVF9OQU1FKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLm5hbWVIb2xkZXIgPSB0aGlzLmJ1aWxkTmFtZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuYWxsQ2Fwc05hbWVIb2xkZXIgPSB0aGlzLmJ1aWxkQWxsQ2Fwc05hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KHZtLCBUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEFsbENhcHNOYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRleHRGaWVsZFBhbmVsID0gdGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCB0ZXh0RmllbGRQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGV4dEZpZWxkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZE5hbWVUZXh0RmllbGQocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFsbENhcHNOYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCXRleHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5hbGxDYXBzTmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzZXROYW1lQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc2V0TmFtZUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXNldE5hbWVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXNldCBuYW1lIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzZXQgbmFtZSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc2V0TmFtZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0TmFtZShERUZBVUxUX05BTUUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFByaW50TW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJwcmludCBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmFtZTogIiArIHRoaXMudGVzdE1vZGVsLm5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGVsIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjg4NDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGVmYXVsdFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVHJpU3RhdGVDaGVja0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHRyaS1zdGF0ZSBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc0ZsYWcxKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDEiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDIiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJuZXh0IGZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAidW5hdHRhY2hlZCIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMubmV4dEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLm5leHRGbGFnMSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBCb29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgQm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoQm9vbGVhbiBmbGFnMSwgQm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCX0KLQkJcHJpdmF0ZSBCb29sZWFuIG5leHQoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBCb29sZWFuLlRSVUUgOiBiLmJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5GQUxTRSA6IG51bGw7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKEJvb2xlYW4gZmxhZzEpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcxKCkgewotCQkJdGhpcy5zZXRGbGFnMSh0aGlzLm5leHQodGhpcy5mbGFnMSkpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihCb29sZWFuIGZsYWcyKSB7Ci0JCQlCb29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHRGbGFnMigpIHsKLQkJCXRoaXMuc2V0RmxhZzIodGhpcy5uZXh0KHRoaXMuZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoQm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQoZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0Tm90RmxhZzIoKSB7Ci0JCQl0aGlzLnNldE5vdEZsYWcyKHRoaXMubmV4dCh0aGlzLm5vdEZsYWcyKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2NkNDRlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEFsaWduZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbEFsaWduZXJUZXN0IHsKLQotCXByaXZhdGUgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwcml2YXRlIExheW91dCBidWlsZFNwYWNlckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJY29tcG9zaXRlLnNldEJvdW5kcygwLCAwLCBkYXRhLndpZHRoSGludCwgZGF0YS5oZWlnaHRIaW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0KLQkJY29udHJvbEFsaWduZXIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQotCQlzaGVsbCAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0KLQkJaWYgKGNvbnRyb2xBbGlnbmVyICE9IG51bGwpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRyb2xBbGlnbmVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlzaGVsbCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbWF4aW11bSB3aWR0aCBzaG91bGQgYmUgMCwiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gbGFiZWwuZ2V0U2l6ZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplLnggKyAiLCIsCi0JCQlzaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplLnggKyAiLCIsCi0JCQlzaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiU2hvcnQgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb250cm9sQWxpZ25lclRvSXRzZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcik7Ci0JCWZhaWwoIkEgQ29udHJvbEFsaWduZXIgY2FuJ3QgYmUgYWRkZWQgdG8gaXRzZWxmIik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZSA9IG5ldyBpbnRbMV07Ci0KLQkJVGl0bGVBcmVhRGlhbG9nIGRpYWxvZyA9IG5ldyBUaXRsZUFyZWFEaWFsb2coU1dUVXRpbC5nZXRTaGVsbCgpKSB7Ci0KLQkJCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULkxFRlQpOwotCQkJCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQkJCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQkJCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVbMF0gPSBsYWJlbC5nZXRTaXplKCkueDsKLQkJCQltYXhpbXVtV2lkdGhbMF0gPSBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKTsKLQkJCX0KLQkJfTsKLQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5jbG9zZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplWzBdICsgIiwiLAotCQkJc2l6ZVswXSwKLQkJCW1heGltdW1XaWR0aFswXQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpYWxvZ19BZGRDb250cm9sMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWZpbmFsIGludFtdIG1heGltdW1XaWR0aCA9IG5ldyBpbnRbMV07Ci0JCWZpbmFsIGludFtdIHNpemVzID0gbmV3IGludFsyXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCWJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQkJCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQkJCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQm91bmRzKCkgewotCQkJCXN1cGVyLmluaXRpYWxpemVCb3VuZHMoKTsKLQkJCQlzaXplc1swXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCXNpemVzWzFdID0gYnV0dG9uLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJaW50IGxhYmVsU2l6ZSAgPSBzaXplc1swXTsKLQkJaW50IGJ1dHRvblNpemUgPSBzaXplc1sxXTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZSwgYnV0dG9uU2l6ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCW1heGltdW1XaWR0aFswXQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpc3Bvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXggPSBNYXRoLm1heChsYWJlbFNpemUueCwgYnV0dG9uU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2h5T2ZDb250cm9sQWxpZ25lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBBbGlnbmVyMQotCQkvLyAgXgotCQkvLyAgfC1BbGlnbmVyMgotCQkvLyAgICAgXgotCQkvLyAgICAgfC1BbGlnbmVyMwotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIzID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQoY29udHJvbEFsaWduZXIzKTsKLQotCQkvLyBUZXN0IDEKLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIGxhYmVsIHdpZGdldCIpOwotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWludCBsYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJY29udHJvbEFsaWduZXIzLmFkZChsYWJlbDEpOwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGxhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIGxhYmVsV2lkdGgxKTsKLQotCQkvLyBUZXN0IDIKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDIuc2V0VGV4dCgiU2hvcnRMYWJlbCIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IG5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0KLQkJLy8gVGVzdCAzCi0JCUxhYmVsIGxhYmVsMyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwzLnNldFRleHQoIkEgdmVyeSBsb25nIGxhYmVsIHRoYXQgdGFrZXMgYSBsb3Qgb2YgaG9yaXpvbnRhbCBzcGFjZSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbDMpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJaW50IG5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBNYWtlIHN1cmUgYWxsIHRoZSBsb2NrZWQgYXJlIHJlbW92ZWQKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lciwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIzLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCi0JCS8vIENoYW5nZSB0aGUgdGV4dCBvZiBsYWJlbDIKLQkJbGFiZWwyLnNldFRleHQoIm1tIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiYSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudDEgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlwYXJlbnQxLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCB0ZW1wTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50MSwgU1dULk5VTEwpOwotCQl0ZW1wTGFiZWwuc2V0VGV4dCgiYSIpOwotLy8JCXBhcmVudDEubGF5b3V0KHRydWUpOwotCi0JCWludCByZWFsV2lkdGggPSB0ZW1wTGFiZWwuZ2V0U2l6ZSgpLng7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMyA9IGxhYmVsMy5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDIsIG5ld0xhYmVsV2lkdGgzKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEZhbHNlKG5ld0xhYmVsV2lkdGgxID09IHJlYWxXaWR0aCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lciwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIzLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCi0JCS8vIENoYW5nZSB0aGUgdGV4dCBvZiBsYWJlbDEKLQkJbGFiZWwxLnNldFRleHQoIlllcyBhbm90aGVyIGJpZyBsb25nIGxvbmcgdGV4dCBzbyB0aGF0IGFsbCB0aGUgbGFiZWxzIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwgdG8gbWFrZSBzdXJlIENvbnRyb2xBbGlnbmVyIHdvcmtzIGNvcnJlY3RseSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJLy8gV2VpcmQ6IEl0IHNlZW1zIG5vIG5vdGlmaWNhdGlvbiBpcyBzZW50LCBmaXJlIG9uZSBtYW51YWxseQotCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gbGFiZWwxOwotCQlldmVudC50eXBlICAgPSBTV1QuUmVzaXplOwotCQlsYWJlbDEubm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIGV2ZW50KTsKLQotCQlDb21wb3NpdGUgcGFyZW50MiA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQyLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KGxhYmVsMS5nZXRUZXh0KCkpOwotCQlwYXJlbnQyLmxheW91dCh0cnVlKTsKLQotCQlyZWFsV2lkdGggPSB0ZW1wTGFiZWwuZ2V0U2l6ZSgpLng7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMyA9IGxhYmVsMy5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDIsIG5ld0xhYmVsV2lkdGgzKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpLCBuZXdMYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhyZWFsV2lkdGgsIG5ld0xhYmVsV2lkdGgxKTsKLQotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGJ1dHRvbik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgMCwgIiwKLQkJCTAsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiU2hvcnQgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXggPSBNYXRoLm1heChsYWJlbFNpemUueCwgYnV0dG9uU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCVBvaW50IG5ld0J1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCi0JCWFzc2VydE5vdFNhbWUoCi0JCQkiVGhlIG9sZCBtYXggYW5kIG5ldyBtYXggc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsCi0JCQltYXgsCi0JCQluZXdCdXR0b25TaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQluZXdCdXR0b25TaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2w0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIFdpZGdldCAxCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJLy8gV2lkZ2V0IDIKLQkJQ29tcG9zaXRlIHNwYWNlciA9IG5ldyBDb21wb3NpdGUocGFuZSwgU1dULk5VTEwpOwotCQlzcGFjZXIuc2V0TGF5b3V0KGJ1aWxkU3BhY2VyTGF5b3V0KCkpOwotCQl1cGRhdGVHcmlkRGF0YShzcGFjZXIpOwotCQljb250cm9sQWxpZ25lci5hZGQoc3BhY2VyKTsKLQotCQkvLyBXaWRnZXQgMwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIDMgd2lkZ2V0cyBoYXZlIHRoZSBzYW1lIHdpZHRoCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IHNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCQltYXggPSBNYXRoLm1heChtYXgsIHNwYWNlclNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGFjZXIncyB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCi0JCS8vIFJlbW92ZSB0aGUgbGFiZWwgKHRoZSB3aWRlc3Qgd2lkZ2V0KSBhbmQgbWFrZSBzdXJlIHRoZSB3aWR0aCB3YXMKLQkJLy8gY29ycmVjdGx5IGNhbGN1bGF0ZWQKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsKTsKLQotCQlzcGFjZXJTaXplID0gc3BhY2VyLmdldFNpemUoKTsKLQkJYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXgyID0gTWF0aC5tYXgoc3BhY2VyU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydE5vdFNhbWUoCi0JCQkiVGhlIG9sZCBtYXggYW5kIG5ldyBtYXggc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsCi0JCQltYXgsCi0JCQltYXgyCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbWF4MiwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGFjZXIncyB3aWR0aCBzaG91bGQgaGF2ZSBiZWVuIGFkanVzdGVkIiwKLQkJCW1heDIsCi0JCQlzcGFjZXJTaXplLngKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sQWxpZ25lcjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQl1cGRhdGVHcmlkRGF0YShsYWJlbDEpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbDIpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbDEpOwotCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQkvLyBUZXN0IDEKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJLy8gVGVzdCAyCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbDEpOwotCi0JCXdpZHRoID0gbGFiZWwyLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIyLnJlbW92ZShsYWJlbDIpOwotCi0JCXdpZHRoID0gbGFiZWwxLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb250cm9sIGNvbnRyb2wpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sRW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGNiN2YyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sRW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThjZTBiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbFN3aXRjaGVyVGVzdCB7Ci0KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhbmUxOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhbmUyOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZTEoKSB7Ci0KLQkJaWYgKHBhbmUxID09IG51bGwpIHsKLQotCQkJcGFuZTEgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTlVMTCk7Ci0JCQlwYW5lMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZTEsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldFRleHQoIiZUZXN0MjoiKTsKLQotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFuZTEsIFNXVC5CT1JERVIpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFuZTEsIFNXVC5CT1JERVIpOwotCi0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFuZTE7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lMigpIHsKLQotCQlpZiAocGFuZTIgPT0gbnVsbCkgewotCi0JCQlwYW5lMiA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OVUxMKTsKLQkJCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lMiwgU1dULk5VTEwpOwotCQkJbGFiZWwuc2V0VGV4dCgiJlRlc3QxOiIpOwotCi0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYW5lMiwgU1dULkJPUkRFUik7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0KLQkJcmV0dXJuIHBhbmUyOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiAodmFsdWUgPyBwYW5lMSA6IHBhbmUyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCi0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCi0JCQlwYXJlbnQgICA9IG51bGw7Ci0JCQlwYWdlQm9vayA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2goKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHN3aXRjaEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oKTsKLQkJVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gdHJhbnNmb3JtZXIgPSBidWlsZFRyYW5zZm9ybWVyKCk7Ci0KLQkJcGFuZTEgPSBidWlsZFBhbmUxKCk7Ci0JCXBhbmUxLnNldFZpc2libGUoZmFsc2UpOwotCi0JCXBhbmUyID0gYnVpbGRQYW5lMigpOwotCQlwYW5lMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQluZXcgQ29udHJvbFN3aXRjaGVyKAotCQkJc3dpdGNoSG9sZGVyLAotCQkJdHJhbnNmb3JtZXIsCi0JCQlwYWdlQm9vawotCQkpOwotCi0JCS8vIFRlc3QgMQotCQlzd2l0Y2hIb2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUocGFnZUJvb2ssICJjdXJyZW50UGFnZSIpOwotCi0JCWFzc2VydE5vdE51bGwoCi0JCQkiVGhlIHBhZ2UgYm9vaydzIHBhZ2Ugc2hvdWxkbid0IGJlIG51bGwiLAotCQkJY29udHJvbAotCQkpOwotCi0JCWFzc2VydFNhbWUoCi0JCQkiVGhlIGN1cnJlbnQgcGFuZSBzaG91bGQgYmUgcGFuZTEiLAotCQkJcGFuZTEsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJUG9pbnQgcGFuZTFTaXplID0gcGFuZTEuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgcGFnZUJvb2tTaXplID0gcGFnZUJvb2suY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHdpZHRoIG9mIHBhbmUxIiwKLQkJCXBhbmUxU2l6ZS54LAotCQkJcGFnZUJvb2tTaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGhlaWdodCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBoZWlnaHQgb2YgcGFuZTEiLAotCQkJcGFuZTFTaXplLnksCi0JCQlwYWdlQm9va1NpemUueQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQlzd2l0Y2hIb2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCQljb250cm9sID0gKENvbnRyb2wpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShwYWdlQm9vaywgImN1cnJlbnRQYWdlIik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgKLQkJCSJUaGUgcGFnZSBib29rJ3MgcGFnZSBzaG91bGRuJ3QgYmUgbnVsbCIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJYXNzZXJ0U2FtZSgKLQkJCSJUaGUgY3VycmVudCBwYW5lIHNob3VsZCBiZSBwYW5lMiIsCi0JCQlwYW5lMiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlQb2ludCBwYW5lMlNpemUgPSBwYW5lMi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlwYWdlQm9va1NpemUgPSBwYWdlQm9vay5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGggb2YgcGFuZTIiLAotCQkJcGFuZTJTaXplLngsCi0JCQlwYWdlQm9va1NpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgaGVpZ2h0IG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGhlaWdodCBvZiBwYW5lMiIsCi0JCQlwYW5lMlNpemUueSwKLQkJCXBhZ2VCb29rU2l6ZS55Ci0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTcwMmQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Ib2xkZXIsIGNvbWJvKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQljb21iby5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQljb21iby5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJY29tYm8uZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwdFVpVXRpbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNmYjA4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwdFVpVXRpbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1AU3VpdGVDbGFzc2VzCi0oewotCUNvbnRyb2xBbGlnbmVyVGVzdC5jbGFzcywKLQlDb250cm9sU3dpdGNoZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xFbmFibGVyVGVzdC5jbGFzcywKLQlDb250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmNsYXNzLAotCUxhYmVsZWRCdXR0b25UZXN0LmNsYXNzLAotCUxhYmVsZWRMYWJlbFRlc3QuY2xhc3MsCi0JTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5jbGFzcywKLQlQYW5lRW5hYmxlclRlc3QuY2xhc3MsCi0JUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5jbGFzcywKLX0pCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLXB1YmxpYyBmaW5hbCBjbGFzcyBKcHRVaVV0aWxUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpVXRpbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSlVuaXQ0VGVzdEFkYXB0ZXIoSnB0VWlVdGlsVGVzdHMuY2xhc3MpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGUzMDMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQnV0dG9uVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMSgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMigpIHsKLQkJbmV3IExhYmVsZWRCdXR0b24obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCQlsYWJlbGVkQnV0dG9uLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgQnV0dG9uIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJYnV0dG9uLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCQlidXR0b24uZGlzcG9zZSgpOwotCi0JCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJCWxhYmVsZWRCdXR0b24uc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZEJ1dHRvbi5zZXRUZXh0KGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIEJ1dHRvbiBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWJ1dHRvbi5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJYnV0dG9uLmRpc3Bvc2UoKTsKLQotCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZEJ1dHRvbi5zZXRUZXh0KGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmNlNTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRDb250cm9sVXBkYXRlclRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KCk7Ci0JCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgbnVsbCwgaW1hZ2VIb2xkZXIpOwotCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWxhYmVsLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KCk7Ci0JCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgbnVsbCwgaW1hZ2VIb2xkZXIpOwotCi0JCQlsYWJlbC5kaXNwb3NlKCk7Ci0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgdGV4dEhvbGRlcik7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJdGV4dEhvbGRlci5zZXRWYWx1ZShleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWxhYmVsLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCB0ZXh0SG9sZGVyKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJdGV4dEhvbGRlci5zZXRWYWx1ZShleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTYyMjg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkTGFiZWxUZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24xKCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMigpIHsKLQkJbmV3IExhYmVsZWRMYWJlbChudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlsYWJlbC5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHQoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZExhYmVsLnNldFRleHQoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIHRleHQiLAotCQkJZXhwZWN0ZWQsCi0JCQlsYWJlbC5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRMYWJlbC5zZXRUZXh0KGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVkMDg2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFBhbmVFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCURpYWxvZ1BhbmU8Tm9kZT4gcGFuZSA9IG5ldyBEaWFsb2dQYW5lPE5vZGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOb2RlPigpLAotCQkJcGFyZW50KQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJfQotCQl9OwotCi0JCW5ldyBQYW5lRW5hYmxlcihib29sZWFuSG9sZGVyLCBwYW5lKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQlwYW5lLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2QyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lVmlzaWJpbGl0eUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBQYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJRGlhbG9nUGFuZTxOb2RlPiBwYW5lID0gbmV3IERpYWxvZ1BhbmU8Tm9kZT4oCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE5vZGU+KCksCi0JCQlwYXJlbnQpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl9Ci0JCX07Ci0KLQkJbmV3IFBhbmVWaXNpYmlsaXR5RW5hYmxlcihib29sZWFuSG9sZGVyLCBwYW5lKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQlwYW5lLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxZWQ0Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlcnMgKCdlbmFibGVkJyBhbmQgJ3Zpc2libGUnKS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdAotCWV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB2aXNpYmxlSG9sZGVyOwotCXByaXZhdGUgZmluYWwgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0U2VsZWN0aW9uSG9sZGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5lbmFibGVkSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLnZpc2libGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCXRoaXMubGlzdFNlbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihudWxsKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInplcm8iKTsKLQkJcmVzdWx0LmFkZCgib25lIik7Ci0JCXJlc3VsdC5hZGQoInR3byIpOwotCQlyZXN1bHQuYWRkKCJ0aHJlZSIpOwotCQlyZXN1bHQuYWRkKCJmb3VyIik7Ci0JCXJlc3VsdC5hZGQoImZpdmUiKTsKLQkJcmVzdWx0LmFkZCgic2l4Iik7Ci0JCXJlc3VsdC5hZGQoInNldmVuIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDUwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgd2lkZ2V0UGFuZWwgPSB0aGlzLmJ1aWxkV2lkZ2V0UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHdpZGdldFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRXaWRnZXRQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JCUJ1dHRvbiBlbmFibGVkQ29tYm9Cb3hDaGVja0JveCA9IHRoaXMuYnVpbGRFbmFibGVkQ29tYm9Cb3hDaGVja0JveChwYW5lbCk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5lbmFibGVkSG9sZGVyLCBlbmFibGVkQ29tYm9Cb3hDaGVja0JveCk7Ci0KLQkJQnV0dG9uIHZpc2libGVDb21ib0JveENoZWNrQm94ID0gdGhpcy5idWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLnZpc2libGVIb2xkZXIsIHZpc2libGVDb21ib0JveENoZWNrQm94KTsKLQotCQlMYWJlbCBjb21ib0JveExhYmVsID0gdGhpcy5idWlsZENvbWJvQm94TGFiZWwocGFuZWwpOwotCQlDb21ibyBjb21ib0JveCA9IHRoaXMuYnVpbGRDb21ib0JveChwYW5lbCk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5saXN0SG9sZGVyLCB0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIsIGNvbWJvQm94KTsKLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZSh0aGlzLmVuYWJsZWRIb2xkZXIsIGNvbWJvQm94TGFiZWwsIGNvbWJvQm94KTsKLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLnZpc2libGVIb2xkZXIsIGNvbWJvQm94TGFiZWwsIGNvbWJvQm94KTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRFbmFibGVkQ29tYm9Cb3hDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJlbmFibGVkIik7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoInZpc2libGUiKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRDb21ib0JveExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoImxpc3Q6Iik7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgd2lkZ2V0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3aWRnZXRQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRDbGVhckVuYWJsZWRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhclZpc2libGVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkTmV4dEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJFbmFibGVkTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJFbmFibGVkTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJFbmFibGVkTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBlbmFibGVkIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLmNsZWFyRW5hYmxlZE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgZW5hYmxlZCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyRW5hYmxlZE1vZGVsKCkgewotCQl0aGlzLmVuYWJsZWRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJWaXNpYmxlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJWaXNpYmxlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJWaXNpYmxlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciB2aXNpYmxlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLmNsZWFyVmlzaWJsZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdmlzaWJsZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyVmlzaWJsZU1vZGVsKCkgewotCQl0aGlzLnZpc2libGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTnVsbFNlbGVjdGlvbk1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZE51bGxTZWxlY3Rpb25Nb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJudWxsIHNlbGVjdGlvbiBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QudGhpcy5zZXRTZWxlY3Rpb25Nb2RlbE51bGwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJudWxsIHNlbGVjdGlvbiBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdGlvbk1vZGVsTnVsbCgpIHsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5leHRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTmV4dEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGROZXh0QUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QudGhpcy5uZXh0KCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIG5leHQoKSB7Ci0JCXRoaXMubGlzdFNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZSh0aGlzLmdldE5leHRMaXN0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5leHRMaXN0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldCh0aGlzLmdldE5leHRMaXN0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TmV4dExpc3RTZWxlY3Rpb25JbmRleCgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRMaXN0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbmRleCsrOwotCQlyZXR1cm4gKGluZGV4ID09IHRoaXMubGlzdEhvbGRlci5zaXplKCkpID8gMCA6IGluZGV4OwotCX0KLQotCXByaXZhdGUgaW50IGdldExpc3RTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKHRoaXMuZ2V0TGlzdFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaXN0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTE5YjY3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgY2hlY2sgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwodHJ1ZSwgdHJ1ZSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcySG9sZGVyID0gdGhpcy5idWlsZE5vdEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzFIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcxKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc05vdEZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROb3RGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgY2hlY2tCb3hQYW5lbCA9IHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCBjaGVja0JveFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRDaGVja0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3gocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMSIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuZmxhZzFIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuZmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLm5vdEZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQoInVuYXR0YWNoZWQiKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgZGVmYXVsdCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBzZWxlY3RlZDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNoZWNrQm94UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjaGVja0JveFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMlRvZ2dsZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGlwRmxhZzFCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEZsaXBGbGFnMUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImZsaXAgZmxhZyAxIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5mbGlwRmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJmbGlwIGZsYWcgMSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGZsaXBGbGFnMSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RmxhZzEoICEgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMlRvZ2dsZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuVE9HR0xFKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgibm90IGZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTM0NmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiByZWFkLW9ubHkgY29tYm8tYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdAotCWV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlmaW5hbCBUYXNrTGlzdCB0YXNrTGlzdDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcjsKLQlwcml2YXRlIFRleHQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IERyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRhc2tMaXN0ID0gbmV3IFRhc2tMaXN0KCk7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0Pih0aGlzLnRhc2tMaXN0KTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJzd2ltIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygiYmlrZSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJ1biIpOwotCQlUYXNrIHJlc3QgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlc3QiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXBlYXQiKTsKLQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2socmVzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDgwMCwgMzAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgdGFza0xpc3RQYW5lbCA9IHRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCB0YXNrTGlzdFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTMwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKHBhbmVsLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5hdGl2ZSAoQ29tYm8pCi0JCXRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKHBhbmVsLCB0cnVlKTsgIC8vIHRydWUgPSBjdXN0b20gKENDb21ibykKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGN1c3RvbSkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY3VzdG9tID8gNTAgOiAwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudChjdXN0b20gPyAxMDAgOiA1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChwYW5lbCwgY3VzdG9tKTsKLQkJdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0UGFuZWwocGFuZWwsIGN1c3RvbSk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCwgY3VzdG9tKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsLCBjdXN0b20pOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsLCBjdXN0b20pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE9iamVjdFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsLCBjdXN0b20pOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwsIGN1c3RvbSk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwsIGN1c3RvbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJU3RyaW5nIGxhYmVsID0gInByaW1pdGl2ZSB1bnNvcnRlZCI7Ci0JCWlmIChjdXN0b20pIGxhYmVsICs9ICIgKGN1c3RvbSkiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCksIGN1c3RvbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJU3RyaW5nIGxhYmVsID0gInByaW1pdGl2ZSBzb3J0ZWQiOwotCQlpZiAoY3VzdG9tKSBsYWJlbCArPSAiIChjdXN0b20pIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpLCBjdXN0b20pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGN1c3RvbSkgewotCQlTdHJpbmcgbGFiZWwgPSAicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIjsKLQkJaWYgKGN1c3RvbSkgbGFiZWwgKz0gIiAoY3VzdG9tKSI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCksIGN1c3RvbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCB1bnNvcnRlZCI7Ci0JCWlmIChjdXN0b20pIGxhYmVsICs9ICIgKGN1c3RvbSkiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSwgY3VzdG9tKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGN1c3RvbSkgewotCQlTdHJpbmcgbGFiZWwgPSAib2JqZWN0IHNvcnRlZCI7Ci0JCWlmIChjdXN0b20pIGxhYmVsICs9ICIgKGN1c3RvbSkiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSwgY3VzdG9tKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjdXN0b20pIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCByZXZlcnNlIHNvcnRlZCI7Ci0JCWlmIChjdXN0b20pIGxhYmVsICs9ICIgKGN1c3RvbSkiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCksIGN1c3RvbSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgPEU+IHZvaWQgYnVpbGRDb21ib0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsLCBib29sZWFuIGN1c3RvbSkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJTGFiZWwgY29tYm9Cb3hMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQgfCBTV1QuVkVSVElDQUwpOwotCQljb21ib0JveExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQljb21ib0JveExhYmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCUNvbnRyb2wgY29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3gocGFuZWwsIGN1c3RvbSk7Ci0JCWZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm9Cb3hMYWJlbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQljb21ib0JveC5zZXRMYXlvdXREYXRhKGZkKTsKLQkJaWYgKGN1c3RvbSkgewotCQkJU1dUVG9vbHMuYmluZChtb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIChDQ29tYm8pIGNvbWJvQm94KTsgIC8vIHVzZSAjdG9TdHJpbmcoKQotCQl9IGVsc2UgewotCQkJU1dUVG9vbHMuYmluZChtb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIChDb21ibykgY29tYm9Cb3gpOyAgLy8gdXNlICN0b1N0cmluZygpCi0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGN1c3RvbSkgewotCQlpbnQgc3R5bGUgPSBTV1QuUkVBRF9PTkxZOwotCQlyZXR1cm4gY3VzdG9tID8gbmV3IENDb21ibyhwYXJlbnQsIHN0eWxlKSA6IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmNvbXBhcmVUbyh0bzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLX05BTUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VGFzaz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrPiBidWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJpb3JpdHlUYXNrQWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrQWRhcHRlcgotCQlleHRlbmRzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4KLQl7Ci0JCVByaW9yaXR5VGFza0FkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS19QUk9QRVJUWSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUYXNrIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQcmlvcml0eVRhc2soKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFRhc2sgdmFsdWUpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXRQcmlvcml0eVRhc2sodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIodGhpcy50YXNrTGlzdEhvbGRlcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByaW9yaXR5VGFza05hbWVBZGFwdGVyCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+Ci0JewotCQlQcmlvcml0eVRhc2tOYW1lQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXIpIHsKLQkJCXN1cGVyKHRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5QUklPUklUWV9UQVNLX05BTUVfUFJPUEVSVFkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQcmlvcml0eVRhc2tOYW1lKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgdGFza0xpc3RQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhc2tMaXN0UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIG1pc2MgPSB0aGlzLmJ1aWxkTWlzY1Rhc2tQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwocGFuZWwsIG1pc2MpOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZE1pc2NUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTQwMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRDbGVhckxpc3RBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2hhbmdlUHJpb3JpdHlUYXNrQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhclByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJMaXN0QUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbGlzdCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBhbGwgdGhlIHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2hhbmdlUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2hhbmdlIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2hhbmdlUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2hhbmdlIHRoZSBwcmlvcml0eSB0YXNrIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSBwcmlvcml0eSB0YXNrIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNsZWFyQnV0dG9uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjbGVhckJ1dHRvbik7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBhZGRCdXR0b24gPSB0aGlzLmJ1aWxkQWRkQnV0dG9uKHBhbmVsKTsKLQkJQ29udHJvbCByZW1vdmVCdXR0b24gPSB0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFRhc2tUZXh0RmllbGQocGFuZWwsIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRBZGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRBZGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImFkZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmFkZFRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJhZGQgYSB0YXNrIHdpdGggdGhlIG5hbWUgaW4gdGhlIGVudHJ5IGZpZWxkIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZFJlbW92ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNTApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUmVtb3ZlQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZW1vdmVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZW1vdmUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVtb3ZlIHRoZSB0YXNrIHdpdGggdGhlIG5hbWUgaW4gdGhlIGVudHJ5IGZpZWxkIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRhc2tUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBhZGRCdXR0b24sIENvbnRyb2wgcmVtb3ZlQnV0dG9uKSB7Ci0JCXRoaXMudGFza1RleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbik7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChyZW1vdmVCdXR0b24pOwotCQl0aGlzLnRhc2tUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShmZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdGFza1RleHRGaWVsZFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2tUZXh0ID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFza1RleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKHRhc2tUZXh0KTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdC5jbGVhclRhc2tzKCk7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKHRoaXMudGFza0xpc3QpOwotCX0KLQotCXZvaWQgY2hhbmdlUHJpb3JpdHlUYXNrKCkgewotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoVGFzayB0YXNrIDogdGhpcy50YXNrTGlzdC5nZXRUYXNrcygpKSB7Ci0JCQlpZiAodGhpcy50YXNrTGlzdC5nZXRQcmlvcml0eVRhc2soKSA9PSB0YXNrKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2sodGFzayk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3I8VGFzaz4gdGFza3MgPSB0aGlzLnRhc2tMaXN0LnRhc2tzKCk7Ci0JCWlmICh0YXNrcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHRhc2tzLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyUHJpb3JpdHlUYXNrKCkgewotCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFza0xpc3QgKioqKioqKioqKgotCi0JLy8gbm90ZSBhYnNlbmNlIG9mIHZhbGlkYXRpb24uLi4KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhc2tMaXN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHRhc2tOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19OQU1FU19MSVNUID0gInRhc2tOYW1lcyI7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxUYXNrPiB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8VGFzaz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTX0xJU1QgPSAidGFza3MiOwotCQlwcml2YXRlIFN0cmluZyBwcmlvcml0eVRhc2tOYW1lID0gbnVsbDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1RBU0tfTkFNRV9QUk9QRVJUWSA9ICJwcmlvcml0eVRhc2tOYW1lIjsKLQkJcHJpdmF0ZSBUYXNrIHByaW9yaXR5VGFzayA9IG51bGw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9UQVNLX1BST1BFUlRZID0gInByaW9yaXR5VGFzayI7Ci0JCXB1YmxpYyBUYXNrTGlzdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhc2tOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tOYW1lcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmFibGU8VGFzaz4gZ2V0VGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrczsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFRhc2s+IHRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3MubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRQcmlvcml0eVRhc2tOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrTmFtZTsKLQkJfQotCQlwdWJsaWMgVGFzayBnZXRQcmlvcml0eVRhc2soKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmlvcml0eVRhc2s7Ci0JCX0KLQkJcHVibGljIFRhc2sgYWRkVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrTmFtZSwgdGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQlUYXNrIHRhc2sgPSBuZXcgVGFzayh0YXNrTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFzaywgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQlyZXR1cm4gdGFzazsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5pbmRleE9mKHRhc2tOYW1lKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVRhc2sgdGFzayA9IHRoaXMudGFza3MuZ2V0KGluZGV4KTsKLQkJCQlpZiAodGFzayA9PSB0aGlzLnByaW9yaXR5VGFzaykgewotCQkJCQl0aGlzLnNldFByaW9yaXR5VGFzayhudWxsKTsKLQkJCQl9Ci0JCQkJLy8gYXNzdW1lIHRoZSBpbmRleGVzIG1hdGNoLi4uCi0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhclRhc2tzKCkgewotCQkJdGhpcy5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRQcmlvcml0eVRhc2tOYW1lKFN0cmluZyBwcmlvcml0eVRhc2tOYW1lKSB7Ci0JCQlTdHJpbmcgb2xkID0gdGhpcy5wcmlvcml0eVRhc2tOYW1lOwotCQkJdGhpcy5wcmlvcml0eVRhc2tOYW1lID0gcHJpb3JpdHlUYXNrTmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUklPUklUWV9UQVNLX05BTUVfUFJPUEVSVFksIG9sZCwgcHJpb3JpdHlUYXNrTmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJpb3JpdHlUYXNrKFRhc2sgcHJpb3JpdHlUYXNrKSB7Ci0JCQlUYXNrIG9sZCA9IHRoaXMucHJpb3JpdHlUYXNrOwotCQkJdGhpcy5wcmlvcml0eVRhc2sgPSBwcmlvcml0eVRhc2s7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJT1JJVFlfVEFTS19QUk9QRVJUWSwgb2xkLCBwcmlvcml0eVRhc2spOwotCQkJdGhpcy5zZXRQcmlvcml0eVRhc2tOYW1lKChwcmlvcml0eVRhc2sgPT0gbnVsbCkgPyBudWxsIDogcHJpb3JpdHlUYXNrLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFzayAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhc2sgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbnN0YW5jZUNvdW50OwotCQlwcml2YXRlIHN0YXRpYyBpbnQgSU5TVEFOQ0VfQ09VTlQgPSAxOwotCQlwdWJsaWMgVGFzayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuaW5zdGFuY2VDb3VudCA9IElOU1RBTkNFX0NPVU5UKys7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArICI6ICIgKyB0aGlzLmluc3RhbmNlQ291bnQ7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oRGlzcGxheWFibGUgbykgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlIGV4dGVuZHMgTW9kZWwsIENvbXBhcmFibGU8RGlzcGxheWFibGU+IHsKLQkKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcoKTsKLQkJCVN0cmluZyBESVNQTEFZX1NUUklOR19QUk9QRVJUWSA9ICJkaXNwbGF5U3RyaW5nIjsKLQkKLQkKLQkJLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQkKLQkJQ29sbGF0b3IgREVGQVVMVF9DT0xMQVRPUiA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JCUNvbXBhcmF0b3I8RGlzcGxheWFibGU+IERFRkFVTFRfQ09NUEFSQVRPUiA9Ci0JCQluZXcgQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERpc3BsYXlhYmxlIGQxLCBEaXNwbGF5YWJsZSBkMikgewotCQkJCQkvLyBkaXNhbGxvdyBkdXBsaWNhdGVzIGJhc2VkIG9uIG9iamVjdCBpZGVudGl0eQotCQkJCQlpZiAoZDEgPT0gZDIpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCi0JCQkJCS8vIGZpcnN0IGNvbXBhcmUgZGlzcGxheSBzdHJpbmdzIHVzaW5nIHRoZSBkZWZhdWx0IGNvbGxhdG9yCi0JCQkJCWludCByZXN1bHQgPSBERUZBVUxUX0NPTExBVE9SLmNvbXBhcmUoZDEuZGlzcGxheVN0cmluZygpLCBkMi5kaXNwbGF5U3RyaW5nKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gdGhlbiBjb21wYXJlIHVzaW5nIG9iamVjdC1pZAotCQkJCQlyZXN1bHQgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShkMSkgLSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShkMik7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyBJdCdzIHVubGlrZWx5IHRoYXQgd2UgZ2V0IHRvIHRoaXMgcG9pbnQ7IGJ1dCwganVzdCBpbiBjYXNlLCB3ZSB3aWxsIHJldHVybiAtMS4KLQkJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBpbnRyb2R1Y2VzIHNvbWUgbWlsZCB1bnByZWRpY3RhYmlsaXR5IHRvIHRoZSBzb3J0IG9yZGVyCi0JCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJCXJldHVybiAtMTsJCS8vIGlmIGFsbCBlbHNlIGZhaWxzLCBpbmRpY2F0ZSB0aGF0IG8xIDwgbzIKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEaXNwbGF5YWJsZS5ERUZBVUxUX0NPTVBBUkFUT1IiOwotCQkJCX0KLQkJCX07Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2FkNWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBsaXN0IGJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCWZpbmFsIFRhc2tMaXN0IHRhc2tMaXN0OwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyOwotCXByaXZhdGUgVGV4dCB0YXNrVGV4dEZpZWxkOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50YXNrTGlzdCA9IG5ldyBUYXNrTGlzdCgpOwotCQl0aGlzLnRhc2tMaXN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4odGhpcy50YXNrTGlzdCk7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygic3dpbSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soImJpa2UiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJydW4iKTsKLQkJVGFzayByZXN0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXN0Iik7Ci0JCXRoaXMudGFza0xpc3QuYWRkUHJpb3JpdHlUYXNrKHJlc3QpOwotCQlUYXNrIHJlcGVhdCA9IHRoaXMudGFza0xpc3QuYWRkVGFzaygicmVwZWF0Iik7Ci0JCXRoaXMudGFza0xpc3QuYWRkUHJpb3JpdHlUYXNrKHJlcGVhdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXBhcmVudC5zZXRTaXplKDgwMCwgNDAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgdGFza0xpc3RQYW5lbCA9IHRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCB0YXNrTGlzdFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTMwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0UGFuZWwocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE9iamVjdFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAicHJpbWl0aXZlIHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAib2JqZWN0IHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAib2JqZWN0IHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3QgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRVbnNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tVGFza0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSA8RT4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBidWlsZExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIExpc3RWYWx1ZU1vZGVsPEU+IG1vZGVsLCBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJTGFiZWwgbGlzdExhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCB8IFNXVC5WRVJUSUNBTCk7Ci0JCWxpc3RMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAzKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAyMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbGlzdExhYmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbGlzdEJveCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KHBhbmVsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsaXN0TGFiZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbGlzdEJveC5zZXRMYXlvdXREYXRhKGZkKTsKLQkJU1dUVG9vbHMuYmluZChtb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94KTsgIC8vIHVzZSAjdG9TdHJpbmcoKQotCQlyZXR1cm4gbGlzdEJveDsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmNvbXBhcmVUbyh0bzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLX05BTUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VGFzaz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIodGhpcy50YXNrTGlzdEhvbGRlcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByaW9yaXR5VGFza0xpc3RBZGFwdGVyCi0JCWV4dGVuZHMgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+Ci0JCWltcGxlbWVudHMgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUYXNrPgotCXsKLQkJUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjxUYXNrPiBpdGVyYXRvcl8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByaW9yaXR5VGFza3MoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8VGFzaz4gdmFsdWVzKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0UHJpb3JpdHlUYXNrcyh2YWx1ZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgdGFza0xpc3RQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhc2tMaXN0UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIG1pc2MgPSB0aGlzLmJ1aWxkTWlzY1Rhc2tQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwocGFuZWwsIG1pc2MpOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZE1pc2NUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTQwMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRDbGVhckxpc3RBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUHJpb3JpdHlUYXNrQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyUHJpb3JpdHlUYXNrc0FDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJMaXN0QUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbGlzdCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiYWRkIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmFkZFByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgdG8gdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZW1vdmVQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgYSB0YXNrIGZyb20gdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyUHJpb3JpdHlUYXNrc0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyUHJpb3JpdHlUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSBwcmlvcml0eSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuYWRkVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01MCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVtb3ZlIHRoZSB0YXNrIHdpdGggdGhlIG5hbWUgaW4gdGhlIGVudHJ5IGZpZWxkIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRhc2tUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBhZGRCdXR0b24sIENvbnRyb2wgcmVtb3ZlQnV0dG9uKSB7Ci0JCXRoaXMudGFza1RleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbik7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChyZW1vdmVCdXR0b24pOwotCQl0aGlzLnRhc2tUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShmZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdGFza1RleHRGaWVsZFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2tUZXh0ID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFza1RleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKHRhc2tUZXh0KTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdC5jbGVhclRhc2tzKCk7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKHRoaXMudGFza0xpc3QpOwotCX0KLQotCXZvaWQgYWRkUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiB0YXNrcyA9IHRoaXMudGFza0xpc3QudGFza3MoKTsKLQkJd2hpbGUgKHRhc2tzLmhhc05leHQoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuYWRkUHJpb3JpdHlUYXNrKHRhc2tzLm5leHQoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVByaW9yaXR5VGFzaygpIHsKLQkJSXRlcmF0b3I8VGFzaz4gcFRhc2tzID0gdGhpcy50YXNrTGlzdC5wcmlvcml0eVRhc2tzKCk7Ci0JCWlmIChwVGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVByaW9yaXR5VGFzayhwVGFza3MubmV4dCgpKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJQcmlvcml0eVRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyUHJpb3JpdHlUYXNrcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrTGlzdCAqKioqKioqKioqCi0KLQkvLyBub3RlIGFic2VuY2Ugb2YgdmFsaWRhdGlvbi4uLgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFza0xpc3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gdGFza05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFRhc2s+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUYXNrPiBwcmlvcml0eVRhc2tzID0gbmV3IEhhc2hTZXQ8VGFzaz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04gPSAicHJpb3JpdHlUYXNrcyI7Ci0JCXB1YmxpYyBUYXNrTGlzdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhc2tOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tOYW1lcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFRhc2s+IHRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3MubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRhc2s+IHByaW9yaXR5VGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmlvcml0eVRhc2tzLml0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIFRhc2sgYWRkVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrTmFtZSwgdGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQlUYXNrIHRhc2sgPSBuZXcgVGFzayh0YXNrTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFzaywgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQlyZXR1cm4gdGFzazsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5pbmRleE9mKHRhc2tOYW1lKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCQkvLyBhc3N1bWUgdGhlIGluZGV4ZXMgbWF0Y2guLi4KLQkJCQlUYXNrIHJlbW92ZWRUYXNrID0gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHJlbW92ZWRUYXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBhZGRQcmlvcml0eVRhc2soVGFzayB0YXNrKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQcmlvcml0eVRhc2soVGFzayB0YXNrKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbih0YXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyUHJpb3JpdHlUYXNrcygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJpb3JpdHlUYXNrcyhJdGVyYWJsZTxUYXNrPiB0YXNrcykgewotCQkJdGhpcy5wcmlvcml0eVRhc2tzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucHJpb3JpdHlUYXNrcywgdGFza3MpOwotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTiwgdGhpcy5wcmlvcml0eVRhc2tzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFzayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgaW50IGluc3RhbmNlQ291bnQ7Ci0JCXByaXZhdGUgc3RhdGljIGludCBJTlNUQU5DRV9DT1VOVCA9IDE7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5pbnN0YW5jZUNvdW50ID0gSU5TVEFOQ0VfQ09VTlQrKzsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lICsgIjogIiArIHRoaXMuaW5zdGFuY2VDb3VudDsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBvKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgbyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheWFibGUgZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxEaXNwbGF5YWJsZT4gewotCQotCQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQkJU3RyaW5nIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZID0gImRpc3BsYXlTdHJpbmciOwotCQotCQotCQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCQotCQlDb2xsYXRvciBERUZBVUxUX0NPTExBVE9SID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkKLQkJQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4gREVGQVVMVF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERpc3BsYXlhYmxlPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlzcGxheWFibGUgZDEsIERpc3BsYXlhYmxlIGQyKSB7Ci0JCQkJCS8vIGRpc2FsbG93IGR1cGxpY2F0ZXMgYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5Ci0JCQkJCWlmIChkMSA9PSBkMikgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQkJaW50IHJlc3VsdCA9IERFRkFVTFRfQ09MTEFUT1IuY29tcGFyZShkMS5kaXNwbGF5U3RyaW5nKCksIGQyLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJCXJlc3VsdCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQxKSAtIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQyKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGludHJvZHVjZXMgc29tZSBtaWxkIHVucHJlZGljdGFiaWxpdHkgdG8gdGhlIHNvcnQgb3JkZXIKLQkJCQkJLy8gKHVubGVzcyB0aGUgb2JqZWN0cyBhcmUgYWx3YXlzIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIGluIHRoZSBzYW1lIG9yZGVyKS4KLQkJCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRpc3BsYXlhYmxlLkRFRkFVTFRfQ09NUEFSQVRPUiI7Ci0JCQkJfQotCQkJfTsKLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhkOTFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYTYxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTUyNzFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhmOWMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjI2IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI1YzRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU1OjU4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjMDdkZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuc3luY2hyb25pemVyczt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTljMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjNjZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBVdGlsaXR5IFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcmVzb3VyY2UvQ2xhc3NUb29scy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Jlc291cmNlL0NsYXNzVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjMTdiNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcmVzb3VyY2UvQ2xhc3NUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIHRlc3Q7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgamF2YS5sYW5nLnJlZmxlY3QgcGFja2FnZS4KLSAqIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSBzaG9ydGN1dHMgZm9yIG1hbmlwdWxhdGluZyBvYmplY3RzIHZpYQotICogcmVmbGVjdGlvbjsgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIGZpZWxkcyBhbmQvb3IgbWV0aG9kcyB0aGF0Ci0gKiBhcmUgbm90IHB1YmxpY2x5IGFjY2Vzc2libGUgb3IgYXJlIGluaGVyaXRlZC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgYWxsIHRoZSBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGFuZAotICogd3JhcHBlZCBpbiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbnM7IHNvIHRoZXNlIG1ldGhvZHMgc2hvdWxkCi0gKiBiZSB1c2VkIHdoZW4geW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3Ugd2lsbCBub3QgaGF2aW5nIGFueSBwcm9ibGVtcwotICogdXNpbmcgcmVmbGVjdGlvbi4KLSAqIAotICogVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgbWV0aG9kcyB3aG9zZSBuYW1lcwotICogYmVnaW4gd2l0aCAiYXR0ZW1wdCIuIFRoZXNlIG1ldGhvZHMgd2lsbCB0aHJvdyBhIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICogb3IgTm9TdWNoRmllbGRFeGNlcHRpb24gd2hlbiBhcHByb3ByaWF0ZSwgYWxsb3dpbmcgeW91IHRvIHByb2JlCi0gKiBmb3IgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGJ1dCBtaWdodCBub3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc1Rvb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBaRVJPX1BBUkFNRVRFUl9UWVBFUyA9IG5ldyBDbGFzc1swXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFpFUk9fUEFSQU1FVEVSUyA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SID0gJyQnOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEFSUkFZX0lORElDQVRPUiA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9PUEVOID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX0NMT1NFID0gJ10nOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19DT0RFID0gJ0wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIgPSAnOyc7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlW10gUFJJTUlUSVZFUzsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCWVRFX0NPREUgPSAnQic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENIQVJfQ09ERSA9ICdDJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX0NPREUgPSAnRCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZMT0FUX0NPREUgPSAnRic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIElOVF9DT0RFID0gJ0knOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBMT05HX0NPREUgPSAnSic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNIT1JUX0NPREUgPSAnUyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJPT0xFQU5fQ09ERSA9ICdaJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVk9JRF9DT0RFID0gJ1YnOwotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIID0gLTE7ICAvLyBwc2V1ZG8tJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gLTE7ICAvLyBwc2V1ZG8tJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSURfQ0xBU1NfTkFNRSA9IHZvaWQuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSURfV1JBUFBFUl9DTEFTU19OQU1FID0gamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBmaWVsZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuCi0JICogQ2xhc3MjYWxsRmllbGRzKCkKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRmllbGRbXSBhbGxGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPEZpZWxkPiBzdGFjayA9IG5ldyBTdGFjazxGaWVsZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlwdXNoRGVjbGFyZWRGaWVsZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBGaWVsZFtzdGFjay5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWxsTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBhbGxNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdGFjazxNZXRob2Q+IHN0YWNrID0gbmV3IFN0YWNrPE1ldGhvZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlwdXNoRGVjbGFyZWRNZXRob2RzKHRlbXBDbGFzcywgc3RhY2spOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2Uoc3RhY2spOwotCQlyZXR1cm4gc3RhY2sudG9BcnJheShuZXcgTWV0aG9kW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykubmV3SW5zdGFuY2UocGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBpZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpICsgQ1IgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGl0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZ2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogT2JqZWN0I2dldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5nZXQob2JqZWN0KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZ2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI2dldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvR2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLmdldChudWxsKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogSWYgdGhlIGV4ZWN1dGVkIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSAKLQkJdGhyb3dzIFRocm93YWJsZSwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIAotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZQotCSAqIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3Qjc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGF0dGVtcHRUb1NldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaWVsZChvYmplY3QsIGZpZWxkTmFtZSkuc2V0KG9iamVjdCwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIHNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3Mjc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKGphdmFDbGFzcywgZmllbGROYW1lKS5zZXQobnVsbCwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcigpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUNvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yID0gamF2YUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOwotCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gY29uc3RydWN0b3I7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhY2Nlc3NpYmxlRGVjbGFyZWRGaWVsZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGRbXSBkZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZE1ldGhvZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kW10gZGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlNZXRob2RbXSBtZXRob2RzID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0JCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNkZWZhdWx0Q29uc3RydWN0b3IoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGRlZmF1bHRDb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGZpZWxkKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJRmllbGQgZmllbGQgPSBudWxsOwotCQl0cnkgewotCQkJZmllbGQgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gZmllbGQoc3VwZXJjbGFzcywgZmllbGROYW1lKTsKLQkJfQotCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGZpZWxkKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaWVsZChvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbnVsbCwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCS8vIHRoaXMgY2hlY2sgYWxsb3dzIHVzIHRvIHVzZSB0aGlzIGNvZGUgZm9yIGNvbnN0cnVjdG9ycywgd2hlcmUgdGhlIG1ldGhvZE5hbWUgaXMgbnVsbAotCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJCXNiLmFwcGVuZChtZXRob2ROYW1lKTsKLQkJfQotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IG1heCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDE7Ci0JCWlmIChtYXggIT0gLTEpIHsKLQkJCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW21heF0uZ2V0TmFtZSgpKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlci5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3Qgc3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kICsgQ1IgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGl0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogQ29udmVydCBhbGwgb3RoZXIgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCVRocm93YWJsZSBjYXVzZSA9IGl0ZS5nZXRDYXVzZSgpOwotCQkJaWYgKGNhdXNlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QudG9TdHJpbmcoKSwgaXRlKTsKLQkJCX0KLQkJCXRocm93IGNhdXNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZCwgbnVsbCwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRob2QgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIG1ldGhvZChzdXBlcmNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzICh3aXRob3V0IHRoZSBjaGVja2VkIGV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlcik7Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb250byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1c2hEZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPEZpZWxkPiBzdGFjaykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGRlY2xhcmVkRmllbGRzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBmaWVsZHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXN0YWNrLnB1c2goZmllbGRzW2ldKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPE1ldGhvZD4gc3RhY2spIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGRlY2xhcmVkTWV0aG9kcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChtZXRob2RzW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqICJNZW1iZXIiIGNsYXNzZXMgd2lsbCByZXR1cm4gb25seSB0aGUgZmluYWwgbmFtZToKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogICAgICAgICA9PiAiTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogIkxvY2FsIiBhbmQgImFub255bW91cyIgY2xhc3NlcyB3aWxsIHN0aWxsIHJldHVybiB0aGUgZW1iZWRkZWQgJyQnczoKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMSIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDEiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNNZW1iZXIoY2xhc3NOYW1lKSA/Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSkKLQkJOgotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGxhc3RQZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3RQZXJpb2QgPT0gLTEpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBsYXN0UGVyaW9kKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcywKLQkgKiBmb2xsb3dlZCBieSBpdHMgcGFja2FnZSBuYW1lIChlLmcuICJPYmplY3QgKGphdmEubGFuZykiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWVXaXRoUGFja2FnZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lV2l0aFBhY2thZ2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoc2hvcnROYW1lRm9yKGphdmFDbGFzcykpOwotCQlpZiAoICEgamF2YUNsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXNiLmFwcGVuZCgiICgiKTsKLQkJCXNiLmFwcGVuZChwYWNrYWdlTmFtZUZvcihqYXZhQ2xhc3MpKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCwgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtZXRob2QgPSBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWlmIChNb2RpZmllci5pc1N0YXRpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZXN9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNhbiBiZSAiZGVjbGFyZWQiIGluIGNvZGU7Ci0JICogaS5lLiBpdCBpcyBlaXRoZXIgYSAidG9wLWxldmVsIiBjbGFzcyBvciBhICJtZW1iZXIiIGNsYXNzLCBidXQgaXQKLQkgKiBpcyBub3QgYW4gImFycmF5IiBjbGFzcy4gVGhpcyBtZXRob2Qgcm9sbHMgdG9nZXRoZXIgYWxsIHRoZSBjaGVja3MKLQkgKiBmcm9tIHRoZSBvdGhlciBtZXRob2RzIGZvciBhIGJpdCBvZiBhIHBlcmZvcm1hbmNlIHR3ZWFrLgotCSAqIENsYXNzI2lzRGVjbGFyYWJsZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0RlY2xhcmFibGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCXJldHVybiBmYWxzZTsJCS8vIGl0IGlzIGFuICJhcnJheSIgY2xhc3MKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiB0cnVlOwkJLy8gaXQgaXMgYSAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWRvIHsKLQkJCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCBkb2xsYXIgc2lnbiBjYW5ub3QgYmUgYSBkaWdpdAotCQkJaW5kZXgrKzsKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGluZGV4KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiwgaW5kZXgpOwotCQl9IHdoaWxlIChpbmRleCAhPSAtMSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInRvcC1sZXZlbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJtZW1iZXIiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGRvZXMgTk9UIGNvbnRhaW4gYSAnJCc6ICJUb3BMZXZlbENsYXNzIikuCi0JICogQ2xhc3MjaXNUb3BMZXZlbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1RvcExldmVsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSA9PSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgIm1lbWJlciIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSAnJCcgYW5kIGFsbCB0aGUgbmFtZXMgYmV0d2VlbgotCSAqIGVhY2ggJyQnIGFyZSBsZWdhbCBjbGFzcyBuYW1lczoKLQkgKiAiVG9wTGV2ZWxDbGFzcyRNZW1iZXJDbGFzcyROZXN0ZWRNZW1iZXJDbGFzcyIpLgotCSAqIENsYXNzI2lzTWVtYmVyKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzTWVtYmVyKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gaXQgaXMgYSAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWRvIHsKLQkJCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCBkb2xsYXIgc2lnbiBjYW5ub3QgYmUgYSBkaWdpdAotCQkJaW5kZXgrKzsKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGluZGV4KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiwgaW5kZXgpOwotCQl9IHdoaWxlIChpbmRleCAhPSAtMSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibG9jYWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgKG9yIEVjbGlwc2UpIG5hbWluZyBjb252ZW50aW9ucy4KLQkgKiBJbiB0aGUgamRrLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm5YWFgnIHdoZXJlIHRoZSAnJCcgaXMKLQkgKiBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudW1lcmljIGRpZ2l0cyB3aGljaCBhcmUgZm9sbG93ZWQgYnkgdGhlCi0JICogbG9jYWwgY2xhc3MgbmFtZTogIlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiLgotCSAqIEluIEVjbGlwc2UsIHRoZSBjbGFzcyBuYW1lIGVuZHMgd2l0aCAnJG5ubiRYWFgnIHdoZXJlIHRoZSAnJCcgaXMKLQkgKiBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudW1lcmljIGRpZ2l0cyB3aGljaCBhcmUgc2VwYXJhdGVkIGZyb20KLQkgKiB0aGUgbG9jYWwgY2xhc3MgbmFtZSBieSBhbm90aGVyICckJzogIlRvcExldmVsQ2xhc3MkMSRMb2NhbENsYXNzIi4KLQkgKiBDbGFzcyNpc0xvY2FsKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzTG9jYWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBkb2xsYXIgPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoZG9sbGFyID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoZG9sbGFyICsgMSkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IGRvbGxhciArIDI7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJCBhcmUgZGlnaXRzIChhbm9ueW1vdXMpCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJsb2NhbCIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBlbmRzIHdpdGggJyRubm4nIHdoZXJlIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZQotCSAqIGxhc3QgJyQnIGFyZSBudW1lcmljIGRpZ2l0czogIlRvcExldmVsQ2xhc3MkMSIpLgotCSAqIENsYXNzI2lzQW5vbnltb3VzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQW5vbnltb3VzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBzdGFydCA9IGRvbGxhciArIDE7Ci0JCWZvciAoaW50IGkgPSBjbGFzc05hbWUubGVuZ3RoKCk7IGktLSA+IHN0YXJ0OyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJCBhcmUgZGlnaXRzCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqIENsYXNzI2dldEFycmF5RGVwdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlkZXB0aCsrOwotCQkJamF2YUNsYXNzID0gamF2YUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheS4KLQkgKiBOb24tYXJyYXlzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gYXJyYXlEZXB0aEZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqIENsYXNzI2dldEFycmF5RGVwdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IEFSUkFZX0lORElDQVRPUikgewotCQkJZGVwdGgrKzsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiBhcnJheSB0eXBlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNBcnJheShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuY2hhckF0KDApID09IEFSUkFZX0lORElDQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBBIG5vbi1hcnJheSB0eXBlIHNpbXBseSByZXR1cm5zIGl0c2VsZi4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5LgotCSAqIEEgbm9uLWFycmF5IHNpbXBseSByZXR1cm5zIGl0cyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGVsZW1lbnRUeXBlRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZU5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihqYXZhQ2xhc3MpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoY2xhc3NOYW1lKTsKLQkJaWYgKGRlcHRoID09IDApIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiamF2YS5sYW5nLk9iamVjdCIgb3IgImludCIKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJaW50IGxhc3QgPSBjbGFzc05hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gUkVGRVJFTkNFX0NMQVNTX0NPREUpIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbTGphdmEubGFuZy5PYmplY3Q7IgotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoZGVwdGggKyAxLCBsYXN0KTsJLy8gZHJvcCB0aGUgdHJhaWxpbmcgJzsnCi0JCX0KLQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tJIgotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZShjbGFzc05hbWUuY2hhckF0KGxhc3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJyZWZlcmVuY2UiCi0JICogY2xhc3MgKGkuZS4gbmVpdGhlciAndm9pZCcgbm9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogWydib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUmVmZXJlbmNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuICEgY2xhc3NOYW1lZElzUHJpbWl0aXZlKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICd2b2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIFsnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNQcmltaXRpdmUoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gJ2phdmEubGFuZy5Wb2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsCi0JICogWydqYXZhLmxhbmcuQm9vbGVhbicsICdqYXZhLmxhbmcuSW50ZWdlcicsICdqYXZhLmxhbmcuRmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfV1JBUFBFUl9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gJ2phdmEubGFuZy5Wb2lkJyBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsCi0JICogWydqYXZhLmxhbmcuQm9vbGVhbicsICdqYXZhLmxhbmcuSW50ZWdlcicsICdqYXZhLmxhbmcuRmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWlmIChqYXZhQ2xhc3MuaXNBcnJheSgpIHx8IChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0ud3JhcHBlckNsYXNzID09IGphdmFDbGFzcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YUNsYXNzKQotCQkJJiYgKGphdmFDbGFzcyAhPSBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKGNsYXNzQ29kZSkuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uY29kZSA9PSBjbGFzc0NvZGUpIHsKLQkJCQlyZXR1cm4gY29kZXNbaV0uamF2YUNsYXNzOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoY2xhc3NDb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWlmICgoICEgamF2YUNsYXNzLmlzQXJyYXkoKSkgJiYgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJCXJldHVybiBjb2Rlc1tpXS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGphdmFDbGFzcy5nZXROYW1lKCkpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoKCAhIGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpICYmIChjbGFzc05hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJCXJldHVybiBjb2Rlc1tpXS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsYXNzTmFtZSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NUb29scy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSB0eXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXR5cGVEZWNsYXJhdGlvbiA9IFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKTsKLQkJaW50IGFycmF5RGVwdGggPSBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24pOwotCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZygwLCB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAoYXJyYXlEZXB0aCAqIDIpKTsKLQkJcmV0dXJuIG5ldyBUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQkvLyBzZWUgdGhlICJFdmFsdWF0aW9uIiBvZiBqZGsgYnVnIDY0NDY2MjcgZm9yIGEgZGlzY3Vzc2lvbiBvZiBsb2FkaW5nIGNsYXNzZXMKLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyBwcmltaXRpdmVzIGNhbm5vdCBiZSBsb2FkZWQgdmlhIENsYXNzI2Zvck5hbWUoKSwKLQkJLy8gc28gY2hlY2sgZm9yIGEgcHJpbWl0aXZlIGNsYXNzIG5hbWUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpIHsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50VHlwZU5hbWUpKSB7Ci0JCQkJCXBjYyA9IGNvZGVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIChwY2MgPT0gbnVsbCkgPyBDbGFzcy5mb3JOYW1lKGVsZW1lbnRUeXBlTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSA6IHBjYy5qYXZhQ2xhc3M7Ci0JCX0KLQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQkJaWYgKHBjYyA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX0NPREUpOwotCQkJc2IuYXBwZW5kKGVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoc2IudG9TdHJpbmcoKSwgZmFsc2UsIGNsYXNzTG9hZGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLgotCSAqICAgICAiaW50W10iIC0+ICJbSSIKLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSB0eXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgZGVwdGggZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQkvKgotCSAqIEFzc3VtZSBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCWludCBsYXN0ID0gdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gMTsKLQkJaW50IGRlcHRoID0gMDsKLQkJaW50IGNsb3NlID0gbGFzdDsKLQkJd2hpbGUgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UpID09IFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UpIHsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlIC0gMSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9PUEVOKSB7Ci0JCQkJZGVwdGgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlIGRlY2xhcmF0aW9uOiAiICsgdHlwZURlY2xhcmF0aW9uKTsKLQkJCX0KLQkJCWNsb3NlID0gbGFzdCAtIChkZXB0aCAqIDIpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50VHlwZU5hbWU7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCInIiArIFZPSURfQ0xBU1NfTkFNRSArICInIG11c3QgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7Ci0JCX0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0KLQkJLy8gbG9vayBmb3IgYSBwcmltaXRpdmUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpIHsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50VHlwZU5hbWUpKSB7Ci0JCQkJCXBjYyA9IGNvZGVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWlmIChNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIID09IC0xKSB7Ci0JCQlNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgbGVuID0gY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9PSAtMSkgewotCQkJTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaW50IGxlbiA9IGNvZGVzW2ldLndyYXBwZXJDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlW10gcHJpbWl0aXZlcygpIHsKLQkJaWYgKFBSSU1JVElWRVMgPT0gbnVsbCkgewotCQkJUFJJTUlUSVZFUyA9IGJ1aWxkUHJpbWl0aXZlcygpOwotCQl9Ci0JCXJldHVybiBQUklNSVRJVkVTOwotCX0KLQkKLQkvKioKLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBidWlsZFByaW1pdGl2ZXMoKSB7Ci0JCVByaW1pdGl2ZVtdIHJlc3VsdCA9IG5ldyBQcmltaXRpdmVbOV07Ci0JCXJlc3VsdFswXSA9IG5ldyBQcmltaXRpdmUoQllURV9DT0RFLCBqYXZhLmxhbmcuQnl0ZS5jbGFzcyk7Ci0JCXJlc3VsdFsxXSA9IG5ldyBQcmltaXRpdmUoQ0hBUl9DT0RFLCBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzKTsKLQkJcmVzdWx0WzJdID0gbmV3IFByaW1pdGl2ZShET1VCTEVfQ09ERSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7Ci0JCXJlc3VsdFszXSA9IG5ldyBQcmltaXRpdmUoRkxPQVRfQ09ERSwgamF2YS5sYW5nLkZsb2F0LmNsYXNzKTsKLQkJcmVzdWx0WzRdID0gbmV3IFByaW1pdGl2ZShJTlRfQ09ERSwgamF2YS5sYW5nLkludGVnZXIuY2xhc3MpOwotCQlyZXN1bHRbNV0gPSBuZXcgUHJpbWl0aXZlKExPTkdfQ09ERSwgamF2YS5sYW5nLkxvbmcuY2xhc3MpOwotCQlyZXN1bHRbNl0gPSBuZXcgUHJpbWl0aXZlKFNIT1JUX0NPREUsIGphdmEubGFuZy5TaG9ydC5jbGFzcyk7Ci0JCXJlc3VsdFs3XSA9IG5ldyBQcmltaXRpdmUoQk9PTEVBTl9DT0RFLCBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcyk7Ci0JCXJlc3VsdFs4XSA9IG5ldyBQcmltaXRpdmUoVk9JRF9DT0RFLCBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIENsYXNzVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmltaXRpdmUgewotCQlmaW5hbCBjaGFyIGNvZGU7Ci0JCWZpbmFsIENsYXNzPD8+IGphdmFDbGFzczsKLQkJZmluYWwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUgPSAiVFlQRSI7Ci0JCS8vIGUuZy4gamF2YS5sYW5nLkJvb2xlYW4uVFlQRSA9PiBib29sZWFuLmNsYXNzCi0JCVByaW1pdGl2ZShjaGFyIGNvZGUsIENsYXNzPD8+IHdyYXBwZXJDbGFzcykgewotCQkJdGhpcy5jb2RlID0gY29kZTsKLQkJCXRoaXMud3JhcHBlckNsYXNzID0gd3JhcHBlckNsYXNzOwotCQkJdGhpcy5qYXZhQ2xhc3MgPSAoQ2xhc3M8Pz4pIHN0YXRpY0ZpZWxkVmFsdWUod3JhcHBlckNsYXNzLCBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlRGVjbGFyYXRpb24gewotCQlmaW5hbCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lOwotCQlmaW5hbCBpbnQgYXJyYXlEZXB0aDsKLQkJVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlTmFtZSA9IGVsZW1lbnRUeXBlTmFtZTsKLQkJCXRoaXMuYXJyYXlEZXB0aCA9IGFycmF5RGVwdGg7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQXJyYXlUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTk0YzIxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQXJyYXlUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBcnJheVRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQXJyYXlUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnN0YW50aWF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdBcnJheU9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSBuZXcgU3RyaW5nWzJdOwotCQlTdHJpbmdbXSBhcnJheTIgPSBBcnJheVRvb2xzLm5ld0FycmF5KGFycmF5MSwgNSk7Ci0JCWFycmF5MlswXSA9ICJmb28iOwotCQlhcnJheTJbNF0gPSAiYmFyIjsKLQkJYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJyYXkyLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdBcnJheU9iamVjdEFycmF5SW50X0V4Y2VwdGlvbigpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gbmV3IFN0cmluZ1syXTsKLQkJT2JqZWN0W10gYXJyYXkyID0gQXJyYXlUb29scy5uZXdBcnJheShhcnJheTEsIDUpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhcnJheTJbMV0gPSBJbnRlZ2VyLnZhbHVlT2YoNyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhhcnJheTIpKTsKLQkJfSBjYXRjaCAoQXJyYXlTdG9yZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb25lbnRUeXBlKCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbMl07Ci0JCUNsYXNzPD8gZXh0ZW5kcyBTdHJpbmc+IGphdmFDbGFzcyA9IEFycmF5VG9vbHMuY29tcG9uZW50VHlwZShhcnJheSk7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGphdmFDbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gQXJyYXlUb29scy5uZXdBcnJheShTdHJpbmcuY2xhc3MsIDUpOwotCQlhcnJheVswXSA9ICJmb28iOwotCQlhcnJheVs0XSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdBcnJheUNsYXNzSW50X0V4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBBcnJheVRvb2xzLm5ld0FycmF5KFN0cmluZy5jbGFzcywgNSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFycmF5WzFdID0gSW50ZWdlci52YWx1ZU9mKDcpOwotCQkJZmFpbCgiYm9ndXMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoYXJyYXkpKTsKLQkJfSBjYXRjaCAoQXJyYXlTdG9yZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdBcnJheUNsYXNzSW50X1ByaW1pdGl2ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJT2JqZWN0W10gYXJyYXkgPSBBcnJheVRvb2xzLm5ld0FycmF5KGludC5jbGFzcywgNSk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhhcnJheSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVJbnQoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSwgbmV3IE9iamVjdFswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVJbnRPYmplY3RBcnJheSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3IoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvck9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfRW1wdHlfQ2xlYXJBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIG5ldyBTdHJpbmdbNV0pOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnROdWxsKGFbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBuZXcgT2JqZWN0WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludE9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlPYmplY3RfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hZGQodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidHdlbnR5IikpOwotCQlhc3NlcnRFcXVhbHMoInR3ZW50eSIsIGFbYS5sZW5ndGgtMV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheU9iamVjdF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCksICJ0d2VudHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgInR3ZW50eSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3ZW50eSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d2VudHkiLCBhWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMiwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9FbmQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDQsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfWmVybygpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIlgiLCAiYSIsICJiIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9FeGNlcHRpb24oKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMzLCAiWCIpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gQXJyYXlUb29scy5hZGQodGhpcy5idWlsZENoYXJBcnJheSgpLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUNoYXJfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAyLCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdYJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyX1plcm8oKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMCwgJ1gnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdYJywgJ2EnLCAnYicsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcl9FbmQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNCwgJ1gnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgMzApOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnRfRW1wdHkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50WzBdOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDMwIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAyLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgOTksIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludF9aZXJvKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMCwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDk5LCAxLCAyLCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnRJbnRfRW5kKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNCwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQsIDk5IH0sIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX1N0cmluZ19FbmQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMywgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fRW1wdHlBcnJheV9FeGNlcHRpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDMsIGMpOwotCQkJZmFpbCgiYm9ndXMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcobmV3QXJyYXkpKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYWJsZSwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhYmxlLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X0VtcHR5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYWJsZSwgMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JJbnRfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgaXRlcmF0b3IsIDMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYXRvciwgMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhYmxlLCAzMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9yX09iamVjdCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvciA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpLml0ZXJhdG9yKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvciA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpLml0ZXJhdG9yKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvciwgMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgYTIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGExKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgYTIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIChPYmplY3RbXSkgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCAoT2JqZWN0W10pIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfT2JqZWN0U3RyaW5nKCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkyKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIChPYmplY3RbXSkgYTIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGExKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgKE9iamVjdFtdKSBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5QXJyYXkxKCkgewotCQlPYmplY3RbXSBhMSA9IG5ldyBPYmplY3RbMF07Ci0JCU9iamVjdFtdIGEyID0gdGhpcy5idWlsZE9iamVjdEFycmF5MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJT2JqZWN0W10gYTEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFswXTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgYTIpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGExKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJYIiwgIlgiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9PYmplY3RTdHJpbmcoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIChPYmplY3RbXSkgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJYIiwgIlgiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbmQoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDQsIChPYmplY3RbXSkgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIChPYmplY3RbXSkgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDQsIChPYmplY3RbXSkgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X0VtcHR5QXJyYXkxKCkgewotCQlPYmplY3RbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyW10geyAnZCcsICdlJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2UnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5RW1wdHlBcnJheTEoKSB7Ci0JCWNoYXJbXSBhID0gQXJyYXlUb29scy5hZGRBbGwobmV3IGNoYXJbMF0sIG5ldyBjaGFyW10geyAnZCcsICdlJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2UnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnWCcsICdYJywgJ1gnLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbmQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdYJywgJ1gnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGNoYXJbMF0pOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBBcnJheVRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgbmV3IGludFtdIHsgMzAsIDQwIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDQwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50QXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWludFtdIGEgPSBBcnJheVRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgbmV3IGludFswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCWludFtdIGEgPSBBcnJheVRvb2xzLmFkZEFsbChuZXcgaW50WzBdLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgOTksIDk5LCA5OSwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXlfRW5kKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgbmV3IGludFtdIHsgOTksIDk5LCA5OSB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0LCA5OSwgOTksIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBpbnRbMF0pOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50WzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgbmV3IGludFtdIHsgOTksIDk5LCA5OSB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA5OSwgOTksIDk5IH0sIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLmNsZWFyKGEpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhck9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMuY2xlYXIoYSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmNhdGVuYXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb25jYXRlbmF0ZU9iamVjdEFycmF5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlTdHJpbmdbXSBlQXJyYXkgPSBuZXcgU3RyaW5nW10geyAiZSIsICJmIiwgImciLCAiaCIgfTsKLQkJU3RyaW5nW10gaUFycmF5ID0gbmV3IFN0cmluZ1tdIHsgImkiLCAiaiIsICJrIiwgImwiIH07Ci0KLQkJU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiIH07Ci0JCVN0cmluZ1tdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlT2JqZWN0QXJyYXlBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYUFycmF5ID0gbmV3IFN0cmluZ1tdIHsgIH07Ci0JCVN0cmluZ1tdIGVBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGlBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0KLQkJU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWN0dWFsLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlQ2hhckFycmF5QXJyYXkoKSB7Ci0JCWNoYXJbXSBhQXJyYXkgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWNoYXJbXSBlQXJyYXkgPSBuZXcgY2hhcltdIHsgJ2UnLCAnZicsICdnJywgJ2gnIH07Ci0JCWNoYXJbXSBpQXJyYXkgPSBuZXcgY2hhcltdIHsgJ2knLCAnaicsICdrJywgJ2wnIH07Ci0KLQkJY2hhcltdIGV4cGVjdGVkID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcgfTsKLQkJY2hhcltdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlQ2hhckFycmF5QXJyYXlfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhQXJyYXkgPSBuZXcgY2hhcltdIHsgIH07Ci0JCWNoYXJbXSBlQXJyYXkgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGlBcnJheSA9IG5ldyBjaGFyWzBdOwotCi0JCWNoYXJbXSBleHBlY3RlZCA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFjdHVhbC5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25jYXRlbmF0ZUludEFycmF5QXJyYXkoKSB7Ci0JCWludFtdIGFBcnJheSA9IG5ldyBpbnRbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlpbnRbXSBlQXJyYXkgPSBuZXcgaW50W10geyAnZScsICdmJywgJ2cnLCAnaCcgfTsKLQkJaW50W10gaUFycmF5ID0gbmV3IGludFtdIHsgJ2knLCAnaicsICdrJywgJ2wnIH07Ci0KLQkJaW50W10gZXhwZWN0ZWQgPSBuZXcgaW50W10geyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnIH07Ci0JCWludFtdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlSW50QXJyYXlBcnJheV9FbXB0eSgpIHsKLQkJaW50W10gYUFycmF5ID0gbmV3IGludFtdIHsgIH07Ci0JCWludFtdIGVBcnJheSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGlBcnJheSA9IG5ldyBpbnRbMF07Ci0KLQkJaW50W10gZXhwZWN0ZWQgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWN0dWFsLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCU9iamVjdFtdIGEyID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhMiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzBdOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0NoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2EnKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ3onKSk7Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMuYWRkKGEsICd6Jyk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhMiwgJ3onKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbMF07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2EnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDEwKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNTUpKTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLmFkZChhLCA1NSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhMiwgNTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbnRBcnJheU9iamVjdF9FbXB0eUFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eSgpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7ICd4JywgJ3knIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJbnRBcnJheUludEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZEludEFycmF5KCksIHRoaXMuYnVpbGRJbnRBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbXSB7IDQ0NCwgODg4IH0pKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBuZXcgU3RyaW5nKCJhIik7Ci0JCVN0cmluZyBiXyA9IG5ldyBTdHJpbmcoImIiKTsKLQkJU3RyaW5nIGNfID0gbmV3IFN0cmluZygiYyIpOwotCQlTdHJpbmcgZF8gPSBuZXcgU3RyaW5nKCJkIik7Ci0JCVN0cmluZyBlXyA9IG5ldyBTdHJpbmcoImUiKTsKLQkJYXNzZXJ0VHJ1ZSgoYSAhPSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiAhPSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCAhPSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSAhPSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmUmFuZ2UoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDEsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAyKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDMsIDMpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZlN0YXJ0KCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IG5ldyBTdHJpbmcoImEiKTsKLQkJU3RyaW5nIGJfID0gbmV3IFN0cmluZygiYiIpOwotCQlTdHJpbmcgY18gPSBuZXcgU3RyaW5nKCJjIik7Ci0JCVN0cmluZyBkXyA9IG5ldyBTdHJpbmcoImQiKTsKLQkJU3RyaW5nIGVfID0gbmV3IFN0cmluZygiZSIpOwotCQlhc3NlcnRUcnVlKChhICE9IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiICE9IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkICE9IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlICE9IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGVfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY19fKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGl0eSBkaWZmICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZFbmQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmUmFuZ2UoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMSwgLTEpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDIpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDApLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDMsIDMpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZlN0YXJ0KCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IGE7Ci0JCVN0cmluZyBiXyA9IGI7Ci0JCVN0cmluZyBjXyA9IGM7Ci0JCVN0cmluZyBkXyA9IGQ7Ci0JCVN0cmluZyBlXyA9IGU7Ci0JCWFzc2VydFRydWUoKGEgPT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgPT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgPT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgPT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgPT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBlXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgaWRlbnRpY2FsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFs0XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJYTFbaV0gPSBTdHJpbmcudmFsdWVPZihpICogMTAwMCk7Ci0JCX0KLQotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbYTEubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMi5sZW5ndGg7IGkrKykgewotCQkJYTJbaV0gPSBhMVtpXTsKLQkJfQotCi0JCWFzc2VydFRydWUoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQkJYTJbMl0gPSAiMjAwMCI7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxPYmplY3RBcnJheU9iamVjdEFycmF5X0JvdGhOdWxsKCkgewotCQlPYmplY3RbXSBhMSA9IG51bGw7Ci0JCU9iamVjdFtdIGEyID0gbnVsbDsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfT25lTnVsbCgpIHsKLQkJT2JqZWN0W10gYTEgPSBudWxsOwotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9EaWZmZXJlbnRMZW5ndGhzKCkgewotCQlPYmplY3RbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIifTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9OwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5pbmRleE9mKGEsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgInR3ZW50eSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X051bGwoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X051bGxfTm90Rm91bmQoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZyBmb28gPSAiZm9vIjsKLQkJU3RyaW5nIGJhciA9ICJiYXIiOwotCQlTdHJpbmcgYmF6ID0gImJheiI7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzNdOwotCQlhWzBdID0gZm9vOwotCQlhWzFdID0gYmFyOwotCQlhWzJdID0gYmF6OwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5pZGVudGl0eUluZGV4T2YoYSwgYmFyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X05vdEZvdW5kKCkgewotCQlTdHJpbmcgZm9vID0gImZvbyI7Ci0JCVN0cmluZyBiYXIgPSAiYmFyIjsKLQkJU3RyaW5nIGJheiA9ICJiYXoiOwotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFszXTsKLQkJYVswXSA9IGZvbzsKLQkJYVsxXSA9IGJhcjsKLQkJYVsyXSA9IGJhejsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5SW5kZXhPZihhLCBuZXcgU3RyaW5nKCJiYXIiKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgJ2QnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZDaGFyQXJyYXlDaGFyX05vdEZvdW5kKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgJ3onKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSW50QXJyYXlJbnRfTm90Rm91bmQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgMTAwMCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRpb24gaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheUNvbXBhcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJCIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiRSIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQSIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mT2JqZWN0QXJyYXlPYmplY3RDb21wYXJhdG9yKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gYyA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoMywgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJCIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiRSIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQSIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQSIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoNiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsYXN0IGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAib25lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X05vdEZvdW5kKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgInR3ZW50eSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3RBcnJheU9iamVjdF9OdWxsKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X051bGxfTm90Rm91bmQoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICdiJykpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZDaGFyQXJyYXlDaGFyX05vdEZvdW5kKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICd6JykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJbnRBcnJheUludF9Ob3RGb3VuZCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgMTAwMCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaW4vbWF4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5DaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygnYScsIEFycmF5VG9vbHMubWluKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5DaGFyQXJyYXlfRXhjZXB0aW9uKCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhclswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhciBjID0gQXJyYXlUb29scy5taW4oYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgY2hhcjogIiArIGMpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkludEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5taW4odGhpcy5idWlsZEludEFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluSW50QXJyYXlfRXhjZXB0aW9uKCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbMF07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWludCBpID0gQXJyYXlUb29scy5taW4oYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgaW50OiAiICsgaSk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4Q2hhckFycmF5MSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgQXJyYXlUb29scy5tYXgodGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heENoYXJBcnJheTIoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geyAneCcsICdhJywgJ2InLCAnYycgfTsKLQkJYXNzZXJ0RXF1YWxzKCd4JywgQXJyYXlUb29scy5tYXgoYXJyYXkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4Q2hhckFycmF5X0V4Y2VwdGlvbigpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbMF07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNoYXIgYyA9IEFycmF5VG9vbHMubWF4KGFycmF5KTsKLQkJCWZhaWwoImJvZ3VzIGNoYXI6ICIgKyBjKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhJbnRBcnJheTEoKSB7Ci0JCWFzc2VydEVxdWFscygyMCwgQXJyYXlUb29scy5tYXgodGhpcy5idWlsZEludEFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50QXJyYXkyKCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDc3LCAzLCAxLCAtMyB9OwotCQlhc3NlcnRFcXVhbHMoNzcsIEFycmF5VG9vbHMubWF4KGFycmF5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5X0V4Y2VwdGlvbigpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50WzBdOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IEFycmF5VG9vbHMubWF4KGFycmF5KTsKLQkJCWZhaWwoImJvZ3VzIGludDogIiArIGkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vdmUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVPYmplY3RBcnJheUludEludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH07Ci0KLQkJU3RyaW5nW10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVPYmplY3RBcnJheUludEludEludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH07Ci0KLQkJU3RyaW5nW10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjMiLCAiMiIsICI0IiwgIjUiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0LCA1IH07Ci0KLQkJaW50W10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDAsIDEsIDMsIDQsIDIsIDUgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDEsIDMsIDQsIDIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDQsIDEsIDMsIDIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDQsIDEsIDMsIDIgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJbnRBcnJheUludEludEludCgpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50W10geyAwLCAxLCAyLCAzLCA0LCA1IH07Ci0KLQkJaW50W10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDAsIDEsIDMsIDQsIDIsIDUgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDEsIDMsIDQsIDIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDQsIDEsIDMsIDIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDAsIDMsIDIsIDQsIDUsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07Ci0KLQkJY2hhcltdIHJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdkJywgJ2UnLCAnYycsICdmJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnYicsICdkJywgJ2UnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZicsICdhJywgJ2UnLCAnYicsICdkJywgJ2MnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2YnLCAnYScsICdlJywgJ2InLCAnZCcsICdjJyB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNoYXJBcnJheUludEludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYicsICdjJywgJ2QnLCAnZScgfTsKLQotCQljaGFyW10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdiJywgJ2UnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdiJywgJ2MnLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnZCcsICdiJywgJ2MnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgMSwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYycsICdiJywgJ2QnLCAnZScsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgMCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdjJywgJ2InLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPYmplY3RBcnJheU9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAidGhyZWUiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmb3VyIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZShhLCAidGhyZWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmaXZlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPYmplY3RBcnJheU9iamVjdF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAidGhyZWUiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmb3VyIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZShhLCAidGhyZWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmaXZlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZScpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2YnKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZShhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2UnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDQwKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDUwKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDUwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIChPYmplY3RbXSkgYTIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9Ob01hdGNoZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ICJYIiwgIlkiLCAiWiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUsIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZS5pdGVyYXRvcigpLCA3KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fTm9NYXRjaGVzKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlkiLCAiWiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdDJywgJ0MnLCAnRCcsICdEJywgJ0YnLCAnRicgfSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHkxKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHkyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9Ob01hdGNoZXMoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnWCcsICdaJyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMSwgMywgMywgNCwgNCwgNiwgNiB9LCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbEludEFycmF5SW50QXJyYXlfRW1wdHkxKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eTIoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5X05vTWF0Y2hlcygpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNTIsIDY3IH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsIG9jY3VycmVuY2VzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidGhyZWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgInR3byIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT2JqZWN0QXJyYXlPYmplY3RfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidGhyZWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2InKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2InKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2cnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdnJyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZycpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZycpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZycpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheUNoYXJfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbMF07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdhJyk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNTUpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAxMCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNzcpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNzcpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNJbnRBcnJheUludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDIyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGR1cGxpY2F0ZSBlbGVtZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgidHdvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCVN0cmluZ1tdIGFycmF5ID0gQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pKTsKLQkJaW50IGkgPSAwOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhcnJheVtpKytdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhcnJheVtpKytdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhcnJheVtpKytdKTsKLQkJYXNzZXJ0RXF1YWxzKGksIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzT2JqZWN0QXJyYXlfU2luZ2xlRWxlbWVudCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKG5ldyBTdHJpbmdbXSB7ICJmb28iIH0pOwotCQlhc3NlcnRFcXVhbHMoMSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9Ob0R1cGxpY2F0ZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgImZvbyIsICJiYXIiLCAiYmF6IiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMoYTEpOwotCQlhc3NlcnRFcXVhbHMoMywgYTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudCBhdCBpbmRleCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhPYmplY3RBcnJheUludCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQSIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4Q2hhckFycmF5SW50KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRBdEluZGV4KGEsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdBJywgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRmlyc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUZpcnN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVGaXJzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDYsIDcsIDMzLCAyLCAxMSB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUxhc3RPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlTGFzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVMYXN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUxhc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiB9LCBhKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50cyBhdCBpbmRleCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleE9iamVjdEFycmF5SW50SW50X1plcm9MZW5ndGgoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGExLCAzLCAwKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhPYmplY3RBcnJheUludEludF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDUpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleENoYXJBcnJheUludEludF9aZXJvTGVuZ3RoKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhMSwgMywgMCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50X0VtcHR5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAwLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOCwgNiwgNyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleEludEFycmF5SW50SW50X1plcm9MZW5ndGgoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYTEsIDMsIDApOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleEludEFycmF5SW50SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAwLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVwbGFjZSBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxPYmplY3RBcnJheU9iamVjdE9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgIkEiLCAiWiIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIloiLCAiQiIsICJaIiwgIkMiLCAiWiIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxPYmplY3RBcnJheU9iamVjdE9iamVjdF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgIkEiLCAiWiIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIloiLCAiQiIsICJaIiwgIkMiLCAiWiIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxPYmplY3RBcnJheU9iamVjdE9iamVjdF9OdWxsKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgbnVsbCwgIkIiLCBudWxsLCAiQyIsIG51bGwsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZXBsYWNlQWxsKGEsIG51bGwsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbENoYXJBcnJheUNoYXJDaGFyKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgJ0EnLCAnWicpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdaJywgJ0InLCAnWicsICdDJywgJ1onLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsSW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAwLCAxLCAwLCA3LCAwLCA5OSB9OwotCQlhID0gQXJyYXlUb29scy5yZXBsYWNlQWxsKGEsIDAsIDEzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEzLCAxLCAxMywgNywgMTMsIDk5IH0sIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV0YWluIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFtdIHsgIkUiLCAiQiIsIG5ldyBJbnRlZ2VyKDcpIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkxKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlPYmplY3RBcnJheTIoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9Cb3RoRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZV9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmFibGUsIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmFibGVJbnRfRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmF0b3IpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmF0b3IsIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCAzKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0FsbCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBjb2xsZWN0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdCJywgJ0InLCAnRScsICdFJyB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eUNoYXJBcnJheTEoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eUNoYXJBcnJheTIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X1JldGFpbkFsbCgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InLCAnRScsICdCJywgJ0UnLCAnQicsICdFJywgJ0InLCAnRScgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFNhbWUoYTEsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAyLCAyLCA1LCA1IH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbEludEFycmF5SW50QXJyYXlfRW1wdHlJbnRBcnJheTIoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbEludEFycmF5SW50QXJyYXlfUmV0YWluQWxsKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDUsIDIsIDUsIDIsIDUsIDIsIDUsIDIsIDUsIDIsIDUgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFNhbWUoYTEsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMucmV2ZXJzZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VPYmplY3RBcnJheV9TaW5nbGV0b24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgImZvbyIgfTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJldmVyc2UoYTEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlQ2hhckFycmF5X1NpbmdsZXRvbigpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdmJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJldmVyc2UoYTEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VJbnRBcnJheV9TaW5nbGV0b24oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNyB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlfWmVybygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheV9PbmUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgImZvbyAgIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfTmVnYXRpdmVEaXN0YW5jZSgpIHsKLQkJU3RyaW5nW10gYTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIC0xKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhMlswXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYTJbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhMlsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50X1plcm8oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgNyk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfT25lKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJmb28gICIgfTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgOCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlfWmVybygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlfT25lKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfTmVnYXRpdmVEaXN0YW5jZSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAtMSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9aZXJvKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDIwMDEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9PbmUoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDIyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlfWmVybygpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheV9PbmUoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNzcgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X1plcm9EaXN0YW5jZSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAzLCAyLCAxIH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X05lZ2F0aXZlRGlzdGFuY2UoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIC0xKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9aZXJvKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDMpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X09uZSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3NyB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA0NCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2h1ZmZsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIChPYmplY3RbXSkgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVPYmplY3RBcnJheV9TaW5nbGV0b24oKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbXSB7ICJmb28iIH07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMuc2h1ZmZsZShuZXcgU3RyaW5nW10geyAiZm9vIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCAoT2JqZWN0W10pIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlQ2hhckFycmF5KCkgewotCQljaGFyW10gYXJyYXkxID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQljaGFyW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVDaGFyQXJyYXlfU2luZ2xldG9uKCkgewotCQljaGFyW10gYXJyYXkxID0gbmV3IGNoYXJbXSB7ICdmJyB9OwotCQljaGFyW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKG5ldyBjaGFyW10geyAnZicgfSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVJbnRBcnJheSgpIHsKLQkJaW50W10gYXJyYXkxID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWludFtdIGFycmF5MiA9IEFycmF5VG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkSW50QXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVJbnRBcnJheV9TaW5nbGV0b24oKSB7Ci0JCWludFtdIGFycmF5MSA9IG5ldyBpbnRbXSB7IDcgfTsKLQkJaW50W10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKG5ldyBpbnRbXSB7IDcgfSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1Yi1hcnJheSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlPYmplY3RBcnJheUludEludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiIsICJqb28iLCAiamFyIiwgImpheiJ9OwotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiIsICJqb28ifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nW10geyJqYXIifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNCwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImpvbyIsICJqYXIiLCAiamF6In07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDYpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5SW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHs3NywgOTksIDMzMywgNCwgOTA5MCwgNDJ9OwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W10gezc3LCA5OSwgMzMzLCA0fTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50W10gezkwOTB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFtdIHs0LCA5MDkwLCA0Mn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDYpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5Q2hhckFycmF5SW50SW50KCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhcltdIHsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnfTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW10geydhJywgJ2InLCAnYycsICdkJ307Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDAsIDQpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2UnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNCwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNSwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhcltdIHsnZCcsICdlJywgJ2YnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3dhcCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcE9iamVjdEFycmF5X1NhbWVJbmRpY2VzKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWExID0gQXJyYXlUb29scy5zd2FwKGExLCAxLCAxKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcENoYXJBcnJheV9TYW1lSW5kaWNlcygpIHsKLQkJY2hhcltdIGExID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQljaGFyW10gYTIgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWExID0gQXJyYXlUb29scy5zd2FwKGExLCAxLCAxKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwSW50QXJyYXlfU2FtZUluZGljZXMoKSB7Ci0JCWludFtdIGExID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWludFtdIGEyID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWExID0gQXJyYXlUb29scy5zd2FwKGExLCAxLCAxKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBcnJheXMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsQm9vbGVhbkFycmF5Qm9vbGVhbigpIHsKLQkJYm9vbGVhbltdIGExID0gbmV3IGJvb2xlYW5bOV07Ci0JCWJvb2xlYW5bXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgdHJ1ZSk7Ci0JCWZvciAoYm9vbGVhbiBiIDogYTEpIHsKLQkJCWFzc2VydFRydWUoYik7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsQm9vbGVhbkFycmF5SW50SW50Qm9vbGVhbigpIHsKLQkJYm9vbGVhbltdIGExID0gbmV3IGJvb2xlYW5bOV07Ci0JCWJvb2xlYW5bXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgZmFsc2UpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWJvb2xlYW5bXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIHRydWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGIgPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RmFsc2UoYik7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUoYik7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JLy8gVE9ETwotCi0KLQkvLyAqKioqKioqKioqIHV0aWxpdHkgKioqKioqKioqKgotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZE9iamVjdEFycmF5MSgpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZFN0cmluZ0FycmF5MSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH07Ci0JfQotCi0JcHJpdmF0ZSBjaGFyW10gYnVpbGRDaGFyQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJyB9OwotCX0KLQotCXByaXZhdGUgaW50W10gYnVpbGRJbnRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IDAsIDEwLCAyMCB9OwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRPYmplY3RBcnJheTIoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyAidGhyZWUiLCAiZm91ciIsICJmaXZlIiB9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRTdHJpbmdBcnJheTIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAidGhyZWUiLCAiZm91ciIsICJmaXZlIiB9OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyZTliOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQml0VG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaXRUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGFnSXNTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc1NldCgweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MjIwNCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAxMDEsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgxMTAzLCAweDExMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAxMDMsIDB4MDEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ0lzT2ZmSW50SW50KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZGRkUsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZFRkUsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDAxMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzT2ZmKDB4RkZGRkVFRkMsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIDB4MDEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIDB4MDEwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZDLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIDB4RkZGRikpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMDEwKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMCwgMHhGRkZGKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MzMzRSwgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDMsIDB4RkZGRikpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4NzM3MywgMHgxMDEwKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4RkZGRiwgMHhGRkZGKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZU9mZkludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwNDAwLCAweDAwMjAsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMDAwLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweDAxMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMTAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZFLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRUZDLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRUVGQywgbmV3IGludFtdIHsgMHgxMTAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHhGMDAwLCAweDBGMDAsIDB4MDBGMCwgMHgwMDBGIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZU9mZkludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4RkZGRiwgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDIwMCwgMHgwMDAzLCAweDAwMDIgfSkpOwotCi0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAxMCB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFuZEZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMCwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYb3JGbGFncygpIHsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDEwLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHhGRjExLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwLCAweDBGMDEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHhGMDEwLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwLCAweDBGMDEsIDB4MEYwMSB9KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuUmVmZXJlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzODA4Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQm9vbGVhblJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJvb2xlYW5SZWZlcmVuY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVEZWZhdWx0KCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXModHJ1ZSkpOwotCQlhc3NlcnRGYWxzZShici5pcyhmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdCgpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRGYWxzZShici5pc05vdCh0cnVlKSk7Ci0JCWFzc2VydFRydWUoYnIuaXNOb3QoZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNUcnVlKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXNUcnVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZhbHNlKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmlzRmFsc2UoKSk7Ci0JCWJyLnNldEZhbHNlKCk7Ci0JCWFzc2VydFRydWUoYnIuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxpcCgpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShici5mbGlwKCkpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShici5mbGlwKCkpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RCb29sZWFuKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JCWJyLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFsc2UoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgY2xvbmUgPSAoQm9vbGVhblJlZmVyZW5jZSkgYnIuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGJyLCBjbG9uZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBicjEgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJQm9vbGVhblJlZmVyZW5jZSBicjIgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGJyMSwgYnIyKTsKLQotCQlCb29sZWFuUmVmZXJlbmNlIGJyMyA9IG5ldyBCb29sZWFuUmVmZXJlbmNlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYnIxLmVxdWFscyhicjMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUJvb2xlYW5SZWZlcmVuY2UgYnIxID0gbmV3IEJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygxLCBicjEuaGFzaENvZGUoKSk7Ci0JCWJyMS5zZXRGYWxzZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYnIxLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJQm9vbGVhblJlZmVyZW5jZSBicjEgPSBuZXcgQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJbdHJ1ZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JCWJyMS5zZXRGYWxzZSgpOwotCQlhc3NlcnRFcXVhbHMoIltmYWxzZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2UyZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJvb2xlYW5Ub29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEJvb2xlYW5Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW4gVFJVRSA9IEJvb2xlYW4uVFJVRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIEZBTFNFID0gQm9vbGVhbi5GQUxTRTsKLQotCXB1YmxpYyBCb29sZWFuVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tk9UKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3QoVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5vdChGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBTkQoKSB7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMuYW5kKFRSVUUsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMuYW5kKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLmFuZChGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5hbmQoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9SKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm9yKFRSVUUsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm9yKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYT1IoKSB7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLnhvcihUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMueG9yKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMueG9yKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLnhvcihGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TkFORCgpIHsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubmFuZChUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubmFuZChUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5hbmQoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5uYW5kKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROT1IoKSB7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5vcihUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5vcihUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5ub3IoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFhOT1IoKSB7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMueG5vcihUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLnhub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMueG5vcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhub3IoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlOWJhMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xhc3NUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RTdGF0aWNGaWVsZDsKLQotCXB1YmxpYyBDbGFzc1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgY2xhc3MgbmFtZS4gVGhlIEVjbGlwc2UgY29tcGlsZXIgZ2VuZXJhdGVzCi0JICogImxvY2FsIiBjbGFzc2VzIHdpdGggbmFtZXMgaW4gdGhlIGZvcm0gImNvbS5mb28uT3V0ZXIkMSRMb2NhbCI7IHdoaWxlIHRoZQotCSAqIEpESyBjb21waWxlciBnZW5lcmF0ZXMgImNvbS5mb28uT3V0ZXIkMUxvY2FsIi4gVGhlcmUgbWlnaHQgYmUgb3RoZXIKLQkgKiBkaWZmZXJlbmNlcy4uLi4gfmJqdgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiQxJCIpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAyKSArIGNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAzKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtdW5nZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb21waWxlckRlcGVuZGVudENsYXNzTmFtZUZvcihjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGaWVsZHMoKSB7Ci0JCWludCBmaWVsZENvdW50ID0gMDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdExpc3QuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlGaWVsZFtdIGZpZWxkcyA9IENsYXNzVG9vbHMuYWxsRmllbGRzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoZmllbGRDb3VudCwgZmllbGRzLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMoZmllbGRzKSwgIm1vZENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJzZXJpYWxWZXJzaW9uVUlEIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJjYXBhY2l0eUluY3JlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5uYW1lcyhmaWVsZHMpLCAiZWxlbWVudENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJlbGVtZW50RGF0YSIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZHNbMF0uaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxNZXRob2RzKCkgewotCQlpbnQgbWV0aG9kQ291bnQgPSAwOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IENsYXNzVG9vbHMuYWxsTWV0aG9kcyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZENvdW50LCBtZXRob2RzLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMobWV0aG9kcyksICJ3YWl0IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKG1ldGhvZHMpLCAiYWRkRWxlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RzWzBdLmlzQWNjZXNzaWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzcygpIHsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NPYmplY3QoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCVZlY3Rvcjw/PiB2ID0gQ2xhc3NUb29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBpbnQuY2xhc3MsIG5ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSkpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gaW50LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KTsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCi0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoLTEpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl2ID0gQ2xhc3NUb29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlJ1bnRpbWVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzOwotCQlwYXJtc1swXSA9ICJmb28iOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdiA9IENsYXNzVG9vbHMuYXR0ZW1wdE5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWx1ZSgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJVmVjdG9yPD8+IHYgPSBuZXcgVmVjdG9yPE9iamVjdD4oaW5pdGlhbENhcGFjaXR5KTsKLQkJT2JqZWN0W10gZWxlbWVudERhdGEgPSAoT2JqZWN0W10pIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQotCQkvLyB0ZXN0IGluaGVyaXRlZCBmaWVsZAotCQlJbnRlZ2VyIG1vZENvdW50SW50ZWdlciA9IChJbnRlZ2VyKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUodiwgIm1vZENvdW50Iik7Ci0JCWludCBtb2RDb3VudCA9IG1vZENvdW50SW50ZWdlci5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbW9kQ291bnQpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzRmllbGRWYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c0ZpZWxkVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUodiwgImJvZ3VzRmllbGQiKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNGaWVsZFZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJaW50IHNpemUgPSAoKEludGVnZXIpIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAic2l6ZSIpKS5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2l6ZSk7Ci0KLQkJdi5hZGRFbGVtZW50KCJmb28iKTsKLQkJc2l6ZSA9ICgoSW50ZWdlcikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygxLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBPYmplY3QuY2xhc3MsICJmb28iKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCQlPYmplY3Qgdm9pZFJlc3VsdCA9IENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYWRkRWxlbWVudCIsIE9iamVjdC5jbGFzcywgImJhciIpOwotCQlhc3NlcnROdWxsKHZvaWRSZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gImZvbyI7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBwYXJtVHlwZXMsIHBhcm1zKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IENsYXNzVG9vbHMuYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZCh2LCAiYm9ndXNNZXRob2QiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZygpIHsKLQkJRG91YmxlIHJhbmRvbU9iamVjdCA9IChEb3VibGUpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuTWF0aC5jbGFzcywgInJhbmRvbSIpOwotCQlhc3NlcnROb3ROdWxsKHJhbmRvbU9iamVjdCk7Ci0JCWRvdWJsZSByYW5kb20gPSByYW5kb21PYmplY3QuZG91YmxlVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShyYW5kb20gPj0gMCk7Ci0JCWFzc2VydFRydWUocmFuZG9tIDwgMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlTdHJpbmcgcyA9IChTdHJpbmcpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBib29sZWFuLmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gQm9vbGVhbi5UUlVFOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHMpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBzKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgImJvZ3VzU3RhdGljTWV0aG9kIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCi0JCS8vIHRlc3Qgbm9uLXN0YXRpYyBtZXRob2QKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInRvU3RyaW5nIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGaWVsZFZhbHVlKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCU9iamVjdFtdIG5ld0VsZW1lbnREYXRhID0gbmV3IE9iamVjdFs1XTsKLQkJbmV3RWxlbWVudERhdGFbMF0gPSAiZm9vIjsKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIsIG5ld0VsZW1lbnREYXRhKTsKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50Q291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCS8vIHRlc3QgaW5oZXJpdGVkIGZpZWxkCi0JCUNsYXNzVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMuYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIsICJmb28iKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdGF0aWNGaWVsZFZhbHVlKCkgewotCQlDbGFzc1Rvb2xzLnNldFN0YXRpY0ZpZWxkVmFsdWUodGhpcy5nZXRDbGFzcygpLCAidGVzdFN0YXRpY0ZpZWxkIiwgIm5ldyB2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHModGVzdFN0YXRpY0ZpZWxkLCAibmV3IHZhbHVlIik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5hdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgImJvZ3VzU3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoIlZlY3RvciIsIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3I8T2JqZWN0PigpKSk7Ci0JCWFzc2VydEVxdWFscygiVmVjdG9yIiwgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWROYW1lKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXAucHV0KCJmb28iLCAiYmFyIik7Ci0JCUVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkVudHJ5IiwgQ2xhc3NUb29scy5uZXN0ZWRDbGFzc05hbWVGb3JPYmplY3QoZW50cnkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFbnRyeSIsIENsYXNzVG9vbHMubmVzdGVkTmFtZUZvcihqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoRm9yKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3I8T2JqZWN0PigpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgaW50WzBdKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF1bMF1bMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgaW50WzBdWzBdWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3Iodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3IoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlRm9yT2JqZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvcjxPYmplY3Q+KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgaW50WzBdKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yT2JqZWN0KG5ldyBqYXZhLnV0aWwuVmVjdG9yWzBdWzBdWzBdKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGludFswXVswXVswXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3Iodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzQ29kZXMoKSB7Ci0JCWFzc2VydEVxdWFscygiYnl0ZSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnQicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGFyIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnRCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnRicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnSicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnUycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ1YnKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdYJyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNUb3BMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSkuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNNZW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSk7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDEyMzQ1YSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcigiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNMb2NhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljbGFzcyBMb2NhbENsYXNzIHsKLQkJCXZvaWQgZm9vKCkgewotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiZm9vIik7Ci0JCQl9Ci0JCX0KLQkJbmV3IExvY2FsQ2xhc3MoKS5mb28oKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSk7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMTEkYWFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMSRhIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyJGFiYyIpKTsgLy8gZWNsaXBzZSBuYW1pbmcgY29udmVudGlvbgotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMiRhYmMxIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQxYSIpKTsgLy8gamRrIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyYWJjIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMxIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMTIzNDUkYTEyMzQiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc0Fub255bW91cygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYTEkYWFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxJGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29kZUZvckNsYXNzKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3MoYnl0ZS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlRm9yQ2xhc3NOYW1lZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdJJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzVG9vbHMuY29kZUZvckNsYXNzTmFtZWQoImludCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZChieXRlLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzc05hbWVkKCJieXRlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuVm9pZC5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3Modm9pZC5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlZvaWQuY2xhc3MpKTsKLQotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkludGVnZXIuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1ByaW1pdGl2ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlckNsYXNzTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy53cmFwcGVyQ2xhc3NOYW1lKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMud3JhcHBlckNsYXNzTmFtZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLndyYXBwZXJDbGFzc05hbWUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMud3JhcHBlckNsYXNzTmFtZShib29sZWFuLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCXRyeSB7Ci0JCQlDbGFzc1Rvb2xzLndyYXBwZXJDbGFzc05hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBnZXQgaGVyZS4uLiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlZvaWQuY2xhc3MsIENsYXNzVG9vbHMud3JhcHBlckNsYXNzKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBDbGFzc1Rvb2xzLndyYXBwZXJDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5GbG9hdC5jbGFzcywgQ2xhc3NUb29scy53cmFwcGVyQ2xhc3MoZmxvYXQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzLCBDbGFzc1Rvb2xzLndyYXBwZXJDbGFzcyhib29sZWFuLmNsYXNzKSk7Ci0KLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMud3JhcHBlckNsYXNzKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBnZXQgaGVyZS4uLiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmdJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcywgQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oInZvaWQiLCAwKSk7Ci0JCXRyeSB7Ci0JCQlDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoIltJIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbSSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQgWyBdIFsgXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5PYmplY3Q7IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5PYmplY3Q7IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdXHRbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W10iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCBbIF0iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQiKSk7Ci0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQgWyBdIikpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZ0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoT2JqZWN0W11bXVtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigidm9pZCIsIDApKTsKLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKEZpZWxkW10gZmllbGRzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWVsZCwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoZmllbGRzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWVsZCBmaWVsZCkgewotCQkJCXJldHVybiBmaWVsZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1ldGhvZCwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IobWV0aG9kcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjYzZGUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc3BhdGg7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9IT01FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKLQotCXB1YmxpYyBDbGFzc3BhdGhUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NlZCgpIHsKLQkJU3RyaW5nIHBhdGggPSAiIjsKLQotCQkvLyBubyBjaGFuZ2VzCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7Ozs7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7IikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXC4uXFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrMVxcamRrMlxcamRrM1xcLi5cXC4uXFwuLlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3NOYW1lKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc05hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlDbGFzczw/PiBqYXZhQ2xhc3MgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3MoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhRmlsZU5hbWUoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9KYXZhRmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVVJMcygpIHsKLQkJVVJMW10gZW50cmllcyA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS51cmxzKCk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvcnQuamFyIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2pkay9pMThuLmphciIpLCBlbnRyaWVzW2krK10uZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvamF3cy5qYXIiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovZm9vL2NsYXNzZXMiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovYmFyL2Jhci5qYXIiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBlbnRyaWVzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJpZXMoKSB7Ci0JCUNsYXNzcGF0aCBjcCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyOzsuO0M6XFxqZGtcXGkxOG4uamFyOzs7QzpcXGpka1xcamF3cy5qYXI7O0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcYmFyXFxiYXIuamFyOyIpKTsKLQkJQ2xhc3NwYXRoLkVudHJ5W10gZW50cmllcyA9IGNwLmVudHJpZXMoKTsKLQkJaW50IGkgPSAwOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIi4iKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcamF3cy5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGZvb1xcY2xhc3NlcyIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxiYXJcXGJhci5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaSwgZW50cmllcy5sZW5ndGgpOwotCi0JCWNwID0gY3AuY29tcHJlc3NlZCgpOwotCQllbnRyaWVzID0gY3AuZW50cmllcygpOwotCQlpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGphd3MuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBlbnRyaWVzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5Rm9yRmlsZU5hbWVkKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBudWxsOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7cnQuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtydC5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKCJydC5qYXIiKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGJlZ2lubmluZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBpbiB0aGUgbWlkZGxlCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGVuZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gbWlzc2luZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydHJ0cnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXRoIGVudHJ5IHNob3VsZCBub3QgYmUgZm91bmQiLCBudWxsLCBlbnRyeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25Gb3JDbGFzcygpIHsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNsYXNzOwotCQlGaWxlIGVudHJ5ID0gbmV3IEZpbGUoQ2xhc3NwYXRoLmxvY2F0aW9uRm9yKGphdmFDbGFzcykpOwotCQlpZiAoZW50cnkuaXNGaWxlKCkgfHwgZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJYXNzZXJ0VHJ1ZShlbnRyeS5leGlzdHMoKSk7Ci0JCX0KLQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUobmV3IEZpbGUoZW50cnksIENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykpLmV4aXN0cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdEphck5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJ0RmlsZSA9IG5ldyBGaWxlKENsYXNzcGF0aC5ydEphck5hbWUoKSk7Ci0JCWFzc2VydFRydWUoInJ0LmphciBkb2VzIG5vdCBleGlzdCIsIHJ0RmlsZS5leGlzdHMoKSk7Ci0KLQkJSmFyRmlsZSBydEphckZpbGUgPSBuZXcgSmFyRmlsZShydEZpbGUpOwotCQlKYXJFbnRyeSBlbnRyeSA9IHJ0SmFyRmlsZS5nZXRKYXJFbnRyeSgiamF2YS9sYW5nL09iamVjdC5jbGFzcyIpOwotCQlydEphckZpbGUuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgcnQuamFyIiwgZW50cnkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpSRUNsYXNzTmFtZXMoKSB7Ci0JCWFzc2VydFRydWUoIlZlY3RvciBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQXJyYXlUb29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlsZSBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQXJyYXlUb29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgamF2YS5pby5GaWxlLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgc3RkRXh0RGlyTmFtZSA9IEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCI7Ci0JCWFzc2VydFRydWUoInN0YW5kYXJkIGV4dGVuc2lvbiBkaXIgbmFtZSBtaXNzaW5nOiAiICsgc3RkRXh0RGlyTmFtZSwgQXJyYXlUb29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCksIHN0ZEV4dERpck5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCkgewotCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJRmlsZSBzdGRFeHREaXIgPSBuZXcgRmlsZShKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiKTsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBtaXNzaW5nOiAiICsgc3RkRXh0RGlyLmdldFBhcmVudCgpLCBBcnJheVRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSwgc3RkRXh0RGlyKSk7Ci0JfQotCi0JLy9Db21tZW50ZWQgb3V0IGR1ZSB0byBpbmNvbXBhdGliaWxpdHkgd2l0aCBJQk0gSkRLICh1c2VkIGluIEVjbGlwc2UgV1RQIEJ1aWxkKQotCS8vVE9ETyBUZXN0IHNob3VsZCBiZSByZXZpc2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJQk0gSkRLCi0JLy8JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc3BhdGhFbnRyaWVzKCkgewotCS8vCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkvLwkJU3RyaW5nIGpkayA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JLy8JCWlmIChqZGsuc3RhcnRzV2l0aCgiMS40IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNSIpKSB7Ci0JLy8JCQlDb2xsZWN0aW9uIGphck5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vCQkJQ2xhc3NwYXRoLkVudHJ5W10gZW50cmllcyA9IENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuZ2V0RW50cmllcygpOwotCS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQkJamFyTmFtZXMuYWRkKGVudHJpZXNbaV0uZmlsZU5hbWUoKSk7Ci0JLy8JCQl9Ci0JLy8JCQlTdHJpbmcgc3RkRXh0SmFyTmFtZSA9IEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIgKyBzZXAgKyAiZG5zbnMuamFyIjsKLQkvLwkJCWFzc2VydFRydWUoImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gamFyIG1pc3Npbmc6ICIgKyBzdGRFeHRKYXJOYW1lLCBqYXJOYW1lcy5jb250YWlucyhzdGRFeHRKYXJOYW1lKSk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlmYWlsKCJ3ZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRlc3QgZm9yIHRoZSBjdXJyZW50IGpkayIpOwotCS8vCQl9Ci0JLy8JfQotCi0JLy9Db21tZW50ZWQgb3V0IGR1ZSB0byBpbmNvbXBhdGliaWxpdHkgd2l0aCBJQk0gSkRLICh1c2VkIGluIEVjbGlwc2UgV1RQIEJ1aWxkKQotCS8vVE9ETyBUZXN0IHNob3VsZCBiZSByZXZpc2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJQk0gSkRLCi0JLy8JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc05hbWVzKCkgewotCS8vCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkvLwkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikpIHsKLQkvLwkJCVN0cmluZyBjbGFzc05hbWUgPSAic3VuLm5ldC5zcGkubmFtZXNlcnZpY2UuZG5zLkROU05hbWVTZXJ2aWNlIjsKLQkvLwkJCWFzc2VydFRydWUoImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gY2xhc3MgbWlzc2luZzogIiArIGNsYXNzTmFtZSwKLQkvLwkJCQkJQXJyYXlUb29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKSk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlmYWlsKCJ3ZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRlc3QgZm9yIHRoZSBjdXJyZW50IGpkayIpOwotCS8vCQl9Ci0JLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFDbGFzc3BhdGhDbGFzc05hbWVzKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJQ2xhc3NMb2FkZXIgY2wgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJLy8gbWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSAibm9ybWFsIiBjbGFzcyBsb2FkZXI7Ci0JCS8vIHdoZW4gdGhlIHRlc3RzIGFyZSBleGVjdXRlZCBhcyBhbiBBTlQgdGFzaywgdGhleSBhcmUgcnVuIHVuZGVyCi0JCS8vIGFuIEFOVCBjbGFzcyBsb2FkZXIgYW5kIHRoZSAiSmF2YSIgY2xhc3NwYXRoIGRvZXMgbm90IGluY2x1ZGUgdGhpcyBjbGFzcwotCQlpZiAoY2wuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgic3VuLm1pc2MiKSkgewotCQkJYXNzZXJ0VHJ1ZSgiY2xhc3MgbWlzc2luZzogIiArIGNsYXNzTmFtZSwgQXJyYXlUb29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUNsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIHBhdGggdG8gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbW9ycGgoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCc7JywgRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIkM6IiwgIiIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbW9ycGggdGhlIHNwZWNpZmllZCBVUkwgdG8gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbW9ycGhVUkwoU3RyaW5nIHVybCkgewotCQlTdHJpbmcgcmVzdWx0ID0gdXJsOwotCQlpZiAoIUFycmF5VG9vbHMuY29udGFpbnMoRmlsZS5saXN0Um9vdHMoKSwgbmV3IEZpbGUoIkM6XFwiKSkpIHsKLQkJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKCIvQzoiLCAiIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3YTIyOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbGxlY3Rpb25Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbGxlY3Rpb25Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0VW5tb2RpZmllZCgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMykpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldDEuY29udGFpbnNBbGwoKExpc3Q8U3RyaW5nPikgaXRlcmFibGUzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyLCBsaXN0Mi5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gbGlzdDE7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLCBsaXN0MS5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZ1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVNldDxPYmplY3Q+IHNldDEgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Nb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdMaXN0RW1wdHlBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIG5ldyBTdHJpbmdbMF0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X1N0cmluZ1NldEVtcHR5QXJyYXkoKSB7Ci0JCVNldDxTdHJpbmc+IHNldCA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVNldDxPYmplY3Q+IHNldCA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBhKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5X0VtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX0VtcHR5SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvciwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYWcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX1N0cmluZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25fT2JqZWN0KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX0VtcHR5KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uSW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludF9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoRW1wdHlFbnVtZXJhdGlvbi48U3RyaW5nPmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcoYy5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnQoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIChPYmplY3RbXSkgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5X1ZhcmFyZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIG5ldyBPYmplY3RbXXsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoQmFnLkVtcHR5LjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb25fT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+Y29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvckludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25PYmplY3RBcnJheSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjLCAoT2JqZWN0W10pIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSB0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQkJdi5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHYuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0VudW1lcmF0aW9uT2JqZWN0X09iamVjdCgpIHsKLQkJVmVjdG9yPE9iamVjdD4gYyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmFibGVPYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBjOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGl0ZXJhYmxlLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9PYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEhhc2hCYWc8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInR3byIpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEsIGMyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUxLCAzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9TdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludEl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZExpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnRMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYSIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImIiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJjIikpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmRW5kTGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZCgiYSIpOwotCQlsaXN0Mi5hZGQoImIiKTsKLQkJbGlzdDIuYWRkKCJjIik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZlN0YXJ0TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGVxdWFsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjEwMDAiKTsKLQkJbGlzdDEuYWRkKCIyMDAwIik7Ci0JCWxpc3QxLmFkZCgiMzAwMCIpOwotCQlsaXN0MS5hZGQoIjQwMDAiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50SXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRXF1YWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLCBsaXN0MikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QxLnNpemUoKTsgaSsrKSB7Ci0JCQlsaXN0Mi5hZGQoU3RyaW5nLnZhbHVlT2YoKGkgKyAxKSAqIDEwMDApKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVEaWZmZXJlbnQobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDE7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9EaWZmZXJlbnRTaXplcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlsaXN0Mi5yZW1vdmUoMyk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVN0cmluZyBvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nIG8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGxpc3QuaXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlSXRlcmFibGUxKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbnVsbDsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZUl0ZXJhYmxlMigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWludCBoYXNoQ29kZSA9IENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscyhsaXN0Lmhhc2hDb2RlKCksIGhhc2hDb2RlKTsKLQotCQlsaXN0LmFkZChudWxsKTsKLQkJaGFzaENvZGUgPSBDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5oYXNoQ29kZSgpLCBoYXNoQ29kZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmFibGVPYmplY3RfU3RyaW5nKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihpdGVyYWJsZSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZ19Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCAic2hhemFtIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfTnVsbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMSIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCi0JCVN0cmluZyBvbmUgPSAiMSI7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIG9uZSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0T2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IGMgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhYmxlL2l0ZXJhdG9yICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBzdHJpbmdzID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzdHJpbmdzKSkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NbaSsrXSwgc3RyaW5nKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoYSk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGFbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVJbnRPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAyMywgIm9uZSIpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihpdGVyYWJsZSwgNDIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvckludE9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIDMsICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCA0LCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JJbnRPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNDIsICJmb28iKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCA1NSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCksIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0R1cGxpY2F0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgKE9iamVjdFtdKSBhKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywoT2JqZWN0W10pICBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDb2xsZWN0aW9uT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAiZml2ZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhMaXN0SW50SW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfSkpOwotCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiRCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJDIiwgIkEiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQotCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9KSk7Ci0JCXJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDAsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkQiLCAiRSIsICJGIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9FbXB0eSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNMaXN0X1NpbmdsZUVsZW1lbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlLCA3KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMxID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMxLmFkZCgiemVybyIpOwotCQljMS5hZGQoIm9uZSIpOwotCQljMS5hZGQoInR3byIpOwotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjMSwgYzIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoYzIuc2l6ZSgpLCBjMS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYzIsIGMxKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzMuYWRkKCJ0aHJlZSIpOwotCQljMy5hZGQoImZvdXIiKTsKLQkJYzMuYWRkKCJmaXZlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlDb2xsZWN0aW9uRW1wdHlJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpLCA5KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb25FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiZm9vIiB9KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb25FbXB0eU9iamVjdEFycmF5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIChPYmplY3RbXSkgbmV3IFN0cmluZ1swXSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yb3RhdGUoZXhwZWN0ZWQsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQotCQlhc3NlcnRFcXVhbHMoc2V0LCBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zZXQobGlzdC5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfU3RyaW5nKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX09iamVjdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX0Nhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKChPYmplY3QpICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uTGlzdEl0ZXJhdG9yX1N0cmluZygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkxpc3RJdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNQcmV2aW91cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZUl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGUoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhYmxlMSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGVJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhYmxlMSwgNzcpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEl0ZXJhYmxlQ29tcGFyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhYmxlMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGVDb21wYXJhdG9ySW50KCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IxID0gbGlzdC5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmF0b3IxKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcy5pdGVyYXRvcigpLCBpdGVyYXRvcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEl0ZXJhdG9ySW50KCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgNzcpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3JDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYXRvcjEsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3JDb21wYXJhdG9ySW50KCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYXRvcjEsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCksIDc3KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcy5pdGVyYXRvcigpLCBpdGVyYXRvcjIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc29ydGVkIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGUoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlSW50KCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzczEuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUsIDUpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzczIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYWJsZUNvbXBhcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzczEuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzczIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYWJsZUNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzczEuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCksIDUpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzczIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9yX1RyZWVTZXQoKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZCgiMCIpOwotCQlzczEuYWRkKCIyIik7Ci0JCXNzMS5hZGQoIjMiKTsKLQkJc3MxLmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoc3MxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzZXQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3JJbnQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSwgOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5idWlsZFN0cmluZ1NldDEoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldE9iamVjdEFycmF5Q29tcGFyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJU3RyaW5nW10gYXJyYXkgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoYXJyYXksIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzczIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPbGQgU2Nob29sIFZlY3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IENvbGxlY3Rpb25Ub29scy52ZWN0b3IoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmFibGVJbnQoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IENvbGxlY3Rpb25Ub29scy52ZWN0b3IoaXRlcmFibGUsIDgpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfU3RyaW5nKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3Rvcih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZlY3Rvckl0ZXJhdG9yX09iamVjdCgpIHsKLQkJVmVjdG9yPE9iamVjdD4gdiA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PnZlY3Rvcih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZlY3Rvckl0ZXJhdG9ySW50KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3Rvcih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCA3KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZlY3Rvck9iamVjdEFycmF5KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3Rvcih0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xlLXVzZSBpdGVyYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmFibGVJdGVyYXRvcigpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBlbXB0eUl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlJdGVyYWJsZTxPYmplY3Q+IGVtcHR5SXRlcmFibGUgPSBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZW1wdHlJdGVyYXRvcik7Ci0JCQotCQlhc3NlcnRGYWxzZShlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQllbXB0eUl0ZXJhdG9yID0gZW1wdHlJdGVyYWJsZS5pdGVyYXRvcigpOwotCQkJZmFpbCgiaW52YWxpZCBpdGVyYXRvcjogIiArIGVtcHR5SXRlcmF0b3IpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duLiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlSXRlcmF0b3JfTlBFKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IG51bGxJdGVyYXRvciA9IG51bGw7Ci0JCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJdGVyYWJsZTxPYmplY3Q+IGVtcHR5SXRlcmFibGUgPSBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobnVsbEl0ZXJhdG9yKTsKLQkJCWZhaWwoImludmFsaWQgaXRlcmFibGU6ICIgKyBlbXB0eUl0ZXJhYmxlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmFibGVJdGVyYXRvcl9Ub1N0cmluZygpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBlbXB0eUl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlJdGVyYWJsZTxPYmplY3Q+IGVtcHR5SXRlcmFibGUgPSBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZW1wdHlJdGVyYXRvcik7Ci0JCWFzc2VydE5vdE51bGwoZW1wdHlJdGVyYWJsZS50b1N0cmluZygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogamF2YS51dGlsLkNvbGxlY3Rpb25zIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gc3JjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBkZXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBzcmMpIHsKLQkJCWRlc3QuYWRkKHMudG9VcHBlckNhc2UoKSk7Ci0JCX0KLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5jb3B5KGRlc3QsIHNyYyk7Ci0JCWFzc2VydFNhbWUoZGVzdCwgcmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoc3JjLCBkZXN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxMaXN0T2JqZWN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLmZpbGwobGlzdCwgImZvbyIpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHJlc3VsdCkgewotCQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLnNodWZmbGUobGlzdCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUxpc3RSYW5kb20oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZShsaXN0LCBuZXcgUmFuZG9tKCkpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLnNvcnQobGlzdCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBMaXN0SW50SW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLnN3YXAobGlzdCwgMCwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQkJTGlzdDxTdHJpbmc+IG9yaWdpbmFsID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5nZXQoMCksIHJlc3VsdC5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZ2V0KDEpLCByZXN1bHQuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmdldCgyKSwgcmVzdWx0LmdldCgyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgaGFybmVzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkNWUxYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kRXhlY3V0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yID0gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kRXhlY3V0b3IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb21tYW5kRXhlY3V0b3Jfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yMSA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb21tYW5kRXhlY3V0b3IxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kRXhlY3V0b3IxLCBjb21tYW5kRXhlY3V0b3IyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcigpIHsKLQkJVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlc3RDb21tYW5kLmNvdW50KTsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKHRlc3RDb21tYW5kKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RDb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciA9IG5ldyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpOwotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMSA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIDEpOwotCQlUaHJlYWQgdGhyZWFkMSA9IG5ldyBUaHJlYWQodGVzdFJ1bm5hYmxlMSk7Ci0JCXRocmVhZDEucnVuKCk7Ci0KLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTIgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCAyKTsKLQkJVGhyZWFkIHRocmVhZDIgPSBuZXcgVGhyZWFkKHRlc3RSdW5uYWJsZTIpOwotCQl0aHJlYWQyLnJ1bigpOwotCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFJ1bm5hYmxlMS50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0UnVubmFibGUxLnRlc3RDb21tYW5kRXhlY3V0b3IuY291bnQpOwotCi0JCWFzc2VydEVxdWFscygyLCB0ZXN0UnVubmFibGUyLnRlc3RDb21tYW5kLmNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRlc3RSdW5uYWJsZTIudGVzdENvbW1hbmRFeGVjdXRvci5jb3VudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kRXhlY3V0b3IgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjsKLQkJZmluYWwgaW50IGV4ZWN1dGlvbkNvdW50OwotCQlmaW5hbCBUZXN0Q29tbWFuZCB0ZXN0Q29tbWFuZCA9IG5ldyBUZXN0Q29tbWFuZCgpOwotCQlmaW5hbCBUZXN0Q29tbWFuZEV4ZWN1dG9yIHRlc3RDb21tYW5kRXhlY3V0b3IgPSBuZXcgVGVzdENvbW1hbmRFeGVjdXRvcigpOwotCQlUZXN0UnVubmFibGUoVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGludCBleGVjdXRpb25Db3VudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgPSB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjsKLQkJCXRoaXMuZXhlY3V0aW9uQ291bnQgPSBleGVjdXRpb25Db3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLnNldCh0aGlzLnRlc3RDb21tYW5kRXhlY3V0b3IpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4ZWN1dGlvbkNvdW50OyBpKyspIHsKLQkJCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUodGhpcy50ZXN0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzliZjAzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbW1hbmRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SdW5uYWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVGhyZWFkTG9jYWxDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbW1hbmRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IENvbW1hbmQuTnVsbC5pbnN0YW5jZSgpOwotCQljb21tYW5kLmV4ZWN1dGUoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbW1hbmRfdG9TdHJpbmcoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IENvbW1hbmQuTnVsbC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGNvbW1hbmQudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tbWFuZCBjb21tYW5kMSA9IENvbW1hbmQuTnVsbC5pbnN0YW5jZSgpOwotCQlDb21tYW5kIGNvbW1hbmQyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb21tYW5kMSk7Ci0JCWFzc2VydFNhbWUoY29tbWFuZDEsIGNvbW1hbmQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb21tYW5kKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZENvbW1hbmRfdG9TdHJpbmcoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IENvbW1hbmQuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZENvbW1hbmRfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kIGNvbW1hbmQxID0gQ29tbWFuZC5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlDb21tYW5kIGNvbW1hbmQyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb21tYW5kMSk7Ci0JCWFzc2VydFNhbWUoY29tbWFuZDEsIGNvbW1hbmQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVubmFibGVDb21tYW5kKCkgewotCQlTaW1wbGVUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlID0gbmV3IFNpbXBsZVRlc3RSdW5uYWJsZSgpOwotCQlhc3NlcnRGYWxzZSh0ZXN0UnVubmFibGUucmFuKTsKLQkJQ29tbWFuZCBjb21tYW5kID0gbmV3IFJ1bm5hYmxlQ29tbWFuZCh0ZXN0UnVubmFibGUpOwotCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXN0UnVubmFibGUucmFuKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgU2ltcGxlVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlib29sZWFuIHJhbiA9IGZhbHNlOwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLnJhbiA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbWFuZFJ1bm5hYmxlKCkgewotCQlUZXN0Q29tbWFuZCB0ZXN0Q29tbWFuZCA9IG5ldyBUZXN0Q29tbWFuZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGVzdENvbW1hbmQuY291bnQpOwotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGVzdENvbW1hbmQpOwotCQlydW5uYWJsZS5ydW4oKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RDb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGhyZWFkTG9jYWxDb21tYW5kIHRocmVhZExvY2FsQ29tbWFuZCA9IG5ldyBUaHJlYWRMb2NhbENvbW1hbmQoKTsKLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTEgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZCwgMSk7Ci0JCVRocmVhZCB0aHJlYWQxID0gbmV3IFRocmVhZCh0ZXN0UnVubmFibGUxKTsKLQkJdGhyZWFkMS5ydW4oKTsKLQotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMiA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kLCAyKTsKLQkJVGhyZWFkIHRocmVhZDIgPSBuZXcgVGhyZWFkKHRlc3RSdW5uYWJsZTIpOwotCQl0aHJlYWQyLnJ1bigpOwotCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFJ1bm5hYmxlMS50ZXN0Q29tbWFuZC5jb3VudCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRlc3RSdW5uYWJsZTIudGVzdENvbW1hbmQuY291bnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgVGhyZWFkTG9jYWxDb21tYW5kIHRocmVhZExvY2FsQ29tbWFuZDsKLQkJZmluYWwgaW50IGV4ZWN1dGlvbkNvdW50OwotCQlmaW5hbCBUZXN0Q29tbWFuZCB0ZXN0Q29tbWFuZCA9IG5ldyBUZXN0Q29tbWFuZCgpOwotCQlUZXN0UnVubmFibGUoVGhyZWFkTG9jYWxDb21tYW5kIHRocmVhZExvY2FsQ29tbWFuZCwgaW50IGV4ZWN1dGlvbkNvdW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50aHJlYWRMb2NhbENvbW1hbmQgPSB0aHJlYWRMb2NhbENvbW1hbmQ7Ci0JCQl0aGlzLmV4ZWN1dGlvbkNvdW50ID0gZXhlY3V0aW9uQ291bnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy50aHJlYWRMb2NhbENvbW1hbmQuc2V0KHRoaXMudGVzdENvbW1hbmQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4ZWN1dGlvbkNvdW50OyBpKyspIHsKLQkJCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY3OTNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRXhjZXB0aW9uSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFeGNlcHRpb25IYW5kbGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxFeGNlcHRpb25IYW5kbGVyKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24obmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRXhjZXB0aW9uSGFuZGxlclRvU3RyaW5nKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChleGNlcHRpb25IYW5kbGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJRXhjZXB0aW9uIG5wZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24obnBlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJYXNzZXJ0U2FtZShucGUsIGV4LmdldENhdXNlKCkpOwotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSGFuZGxlclRvU3RyaW5nKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChleGNlcHRpb25IYW5kbGVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI5N2ZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsZVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEZpbGUgdGVtcERpcjsKLQotCXB1YmxpYyBGaWxlVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlbXBEaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCXRoaXMuZGVsZXRlRGlyKHRoaXMudGVtcERpcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVzSW4oKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJbih0aGlzLnRlbXBEaXIuZ2V0UGF0aCgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBmaWxlIGNvdW50IiwgMywgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3JpZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5kaXJlY3Rvcmllc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDIsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmZpbGVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCA5LCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luVHJlZSgpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5kaXJlY3Rvcmllc0luVHJlZSh0aGlzLnRlbXBEaXIuZ2V0UGF0aCgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBkaXJlY3RvcnkgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBidWlsZCBhbm90aGVyIHRlbXBvcmFyeSBkaXJlY3RvcnkganVzdCBmb3IgdGhpcyB0ZXN0Ci0JCUZpbGUgZGlyID0gdGhpcy5idWlsZFRlbXBEaXIoKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBub3QgY3JlYXRlZCIsIGRpci5leGlzdHMoKSk7Ci0JCUZpbGVUb29scy5kZWxldGVEaXJlY3RvcnkoZGlyLmdldFBhdGgoKSk7Ci0JCWFzc2VydEZhbHNlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBkZWxldGVkIiwgZGlyLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlRGlyZWN0b3J5Q29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBidWlsZCBhbm90aGVyIHRlbXBvcmFyeSBkaXJlY3RvcnkganVzdCBmb3IgdGhpcyB0ZXN0Ci0JCUZpbGUgZGlyID0gdGhpcy5idWlsZFRlbXBEaXIoKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBub3QgY3JlYXRlZCIsIGRpci5leGlzdHMoKSk7Ci0JCUZpbGVUb29scy5kZWxldGVEaXJlY3RvcnlDb250ZW50cyhkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBzaG91bGQgbm90IGhhdmUgYmVlbiBkZWxldGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBjb250ZW50cyBub3QgZGVsZXRlZCIsIGRpci5saXN0RmlsZXMoKS5sZW5ndGggPT0gMCk7Ci0JCWRpci5kZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weVRvRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJkZXN0ZmlsZS50eHQiKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb0ZpbGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weVRvUHJlRXhpc3RpbmdGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQl3cml0ZXIud3JpdGUoInRoaXMgdGV4dCBzaG91bGQgYmUgcmVwbGFjZWQuLi4iKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCXRoaXMuY29weVRvRmlsZShkZXN0RmlsZSwgInRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weVRvRmlsZShGaWxlIGRlc3RGaWxlLCBTdHJpbmcgd3JpdGVTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgInNvdXJjZWZpbGUudHh0Iik7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbd3JpdGVTdHJpbmcubGVuZ3RoKCldOwotCi0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpKTsKLQkJd3JpdGVyLndyaXRlKHdyaXRlU3RyaW5nKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0KLQkJRmlsZVRvb2xzLmNvcHlUb0ZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weVRvRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJU3RyaW5nIHdyaXRlU3RyaW5nID0gInRlc3RDb3B5VG9EaXJlY3RvcnkiOwotCi0JCUZpbGUgZGVzdERpciA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RkaXIiKTsKLQkJZGVzdERpci5ta2RpcigpOwotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgInNvdXJjZWZpbGUudHh0Iik7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbd3JpdGVTdHJpbmcubGVuZ3RoKCldOwotCi0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpKTsKLQkJd3JpdGVyLndyaXRlKHdyaXRlU3RyaW5nKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0KLQkJRmlsZVRvb2xzLmNvcHlUb0RpcmVjdG9yeShzb3VyY2VGaWxlLCBkZXN0RGlyKTsKLQotCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJcmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlTdHJpbmcgcmVhZFN0cmluZyA9IG5ldyBTdHJpbmcocmVhZEJ1ZmZlcik7Ci0JCWFzc2VydEVxdWFscyh3cml0ZVN0cmluZywgcmVhZFN0cmluZyk7Ci0JCQotCQlGaWxlVG9vbHMuY29weVRvRGlyZWN0b3J5KHNvdXJjZUZpbGUsIGRlc3REaXIpOyAvL1RyeSBhZ2FpbiB3aXRoIHRoZSBkaXJlY3RvcnkgaXMgYWxyZWFkeSBjcmVhdGVkCi0JCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJcmVhZFN0cmluZyA9IG5ldyBTdHJpbmcocmVhZEJ1ZmZlcik7Ci0JCWFzc2VydEVxdWFscyh3cml0ZVN0cmluZywgcmVhZFN0cmluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwcmVmaXggPSAiWFhYdGVzdEZpbGVYWFgiOwotCQlGaWxlIHRlc3RGaWxlMSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjEiKTsKLQkJdGVzdEZpbGUxLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSB0ZXN0RmlsZTIgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsIHByZWZpeCArICIyIik7Ci0JCXRlc3RGaWxlMi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSB0aGlzLmJ1aWxkRmlsZUZpbHRlcihwcmVmaXgpOwotCQlJdGVyYXRvcjxGaWxlPiBmaWx0ZXJlZEZpbGVzSXRlcmF0b3IgPSBGaWxlVG9vbHMuZmlsdGVyKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpciksIGZpbHRlcik7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsdGVyZWRGaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGZpbHRlcmVkRmlsZXNJdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygyLCBmaWx0ZXJlZEZpbGVzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyZWRGaWxlcy5jb250YWlucyh0ZXN0RmlsZTEpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMikpOwotCX0KLQotCXByaXZhdGUgRmlsZUZpbHRlciBidWlsZEZpbGVGaWx0ZXIoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaXBFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28ueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoImZvby5iYXIiLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uKCkgewotCQlhc3NlcnRFcXVhbHMoIi54bWwiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28ueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi54bWwiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uYmFyLnhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vLHhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIuIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vLiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHRlbXBEaXIxID0gRmlsZVRvb2xzLnRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlGaWxlIHRlc3RGaWxlMSA9IG5ldyBGaWxlKHRlbXBEaXIxLCAianVuayIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgdGVtcERpcjIgPSBGaWxlVG9vbHMuZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXBEaXIxLCB0ZW1wRGlyMik7Ci0JCWFzc2VydFRydWUodGVtcERpcjIuaXNEaXJlY3RvcnkoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZW1wRGlyMi5saXN0RmlsZXMoKS5sZW5ndGgpOwotCQl0ZW1wRGlyMi5kZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2Fub25pY2FsRmlsZU5hbWUoKSB7Ci0JCUZpbGUgZmlsZTEgPSBuZXcgRmlsZSgiZm9vIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICJiYXIiKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJheiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgIi4uIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICJiYXIiKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJheiIpOwotCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImZvbyIpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiYmFyIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXoiKTsKLQkJRmlsZSBmaWxlMyA9IEZpbGVUb29scy5jYW5vbmljYWxGaWxlKGZpbGUxKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUyLCBmaWxlMyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25XaW5kb3dzKCkgewotCQlyZXR1cm4gdGhpcy5pc0V4ZWN1dGluZ09uKCJXaW5kb3dzIik7Ci0JfQotCi0JLy8JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25MaW51eCgpIHsKLQkvLwkJcmV0dXJuIHRoaXMuaXNFeGVjdXRpbmdPbigiTGludXgiKTsKLQkvLwl9Ci0JLy8KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPbihTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhdGhGaWxlcygpIHsKLQkJRmlsZVtdIGV4cGVjdGVkOwotCQlGaWxlW10gYWN0dWFsOwotCi0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCJDOi8iKSwgbmV3IEZpbGUoIkM6L2ZvbyIpLCBuZXcgRmlsZSgiQzovZm9vL2JhciIpLCBuZXcgRmlsZSgiQzovZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCQl9Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIi8iKSwgbmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIG5ldyBGaWxlKCIvZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoImZvbyIpLCBuZXcgRmlsZSgiZm9vL2JhciIpLCBuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoImZvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLi4iKSwgbmV3IEZpbGUoIi4uL2ZvbyIpLCBuZXcgRmlsZSgiLi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi4uL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLiIpLCBuZXcgRmlsZSgiLi9mb28iKSwgbmV3IEZpbGUoIi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gKEZpbGVbXSkgQ2xhc3NUb29scy5leGVjdXRlU3RhdGljTWV0aG9kKEZpbGVUb29scy5jbGFzcywgInBhdGhGaWxlcyIsIEZpbGUuY2xhc3MsIGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZVBhcmVudEZpbGUoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgzKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHJldHVybjogIiArIGZpbGUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSA9IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBleC5nZXRDYXVzZSgpOwotCQkJCWlmIChpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgcmVsYXRpdmVQYXJlbnRGaWxlKGludCBsZW4pIHsKLQkJcmV0dXJuIChGaWxlKSBDbGFzc1Rvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicmVsYXRpdmVQYXJlbnRGaWxlIiwgaW50LmNsYXNzLCBuZXcgSW50ZWdlcihsZW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvUmVsYXRpdmVGaWxlKCkgewotCQlTdHJpbmcgcHJlZml4ID0gdGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpID8gIkM6IiA6ICIiOwotCQlGaWxlIGZpbGU7Ci0JCUZpbGUgZGlyOwotCQlGaWxlIHJlbGF0aXZlRmlsZTsKLQotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoIi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJkaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4iKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1L2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIHJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIHJlbGF0aXZlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0Fic29sdXRlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSA/ICJDOiIgOiAiIjsKLQkJRmlsZSBmaWxlOwotCQlGaWxlIGRpcjsKLQkJRmlsZSBhYnNvbHV0ZUZpbGU7Ci0KLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJLy8gb24gV2luZG93cywgYSBkcml2ZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBmaWxlIHRvIGJlIGFic29sdXRlIChpLmUuIG5vdCByZWxhdGl2ZSkKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJDOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi8uL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uLy4uL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJmaWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uLy4uLy4uL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJLy8gdG9vIG1hbnkgIi4uIiBkaXJlY3RvcmllcyB3aWxsIHJlc29sdmUgdG8gdGhlIHJvb3Q7Ci0JCS8vIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIFdpbmRvd3MgYW5kIExpbnV4IGNvbW1hbmQgc2hlbGxzCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uLy4uLy4uIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9NeSBEb2N1bWVudHMvTXkgV29ya3NwYWNlL1Byb2plY3QgMSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpLCBhYnNvbHV0ZUZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlTmFtZUlzUmVzZXJ2ZWQoKSB7Ci0JCWJvb2xlYW4gZXhwZWN0ZWQgPSB0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09OIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNvbiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJjT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQVVYIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIkNPTTMiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiTFBUMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJuVUwiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiUHJuIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKCkgewotCQlib29sZWFuIGV4cGVjdGVkID0gdGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJDOi9DT04iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCIvY29uL2ZvbyIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImM6L3RlbXAvY09OIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYmFyLy9iYXovL0FVWCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIkNPTTMvL3R0dCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImQ6L0xQVDMveHh4IikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYzovbXkgZG9jcyBhbmQgc3R1ZmYvdHVlc2RheS9uVUwiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJQcm4iKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVGaWxlKCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZU5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJDOi8iKTsKLQkJZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFwiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lL2FkbWluaXN0cmF0b3IvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvaG9tZSIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVGaWxlSW50KCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiQzovVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxUaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjgsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDM0LCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjYsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMV2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiQzovRG9jdW1lbnRzIGFuZCBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCk7Ci0JCWFzc2VydEVxdWFscygiQzpcXERvY3VtZW50cyBhbmQgU2V0dGluZ3NcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxOb25XaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lL2FkbWluaXN0cmF0b3IvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZVVSTEludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnROb25XaW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnRXaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9DOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL0FkbWluaXN0cmF0b3IvRGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnROb25XaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMzQsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIGFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGJ1aWxkVGVtcERpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGEgbmV3IGRpcmVjdG9yeSBmb3IgZWFjaCB0ZXN0LCB0byBwcmV2ZW50IGFueSBjcm9zcy10ZXN0IGVmZmVjdHMKLQkJRmlsZSBkaXIgPSBGaWxlVG9vbHMubmV3VGVtcG9yYXJ5RGlyZWN0b3J5KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykgKyAiLiIgKyB0aGlzLmdldE5hbWUoKSk7Ci0KLQkJRmlsZSBmaWxlMGEgPSBuZXcgRmlsZShkaXIsICJmaWxlMGEiKTsKLQkJZmlsZTBhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMGIgPSBuZXcgRmlsZShkaXIsICJmaWxlMGIiKTsKLQkJZmlsZTBiLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMGMgPSBuZXcgRmlsZShkaXIsICJmaWxlMGMiKTsKLQkJZmlsZTBjLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjEgPSBuZXcgRmlsZShkaXIsICJzdWJkaXIxIik7Ci0JCXN1YmRpcjEubWtkaXIoKTsKLQkJRmlsZSBmaWxlMWEgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFhIik7Ci0JCWZpbGUxYS5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgZmlsZTFiID0gbmV3IEZpbGUoc3ViZGlyMSwgImZpbGUxYiIpOwotCQlmaWxlMWIuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMiA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjIiKTsKLQkJc3ViZGlyMi5ta2RpcigpOwotCQlGaWxlIGZpbGUyYSA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmEiKTsKLQkJZmlsZTJhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMmIgPSBuZXcgRmlsZShzdWJkaXIyLCAiZmlsZTJiIik7Ci0JCWZpbGUyYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIzID0gbmV3IEZpbGUoc3ViZGlyMiwgInN1YmRpcjMiKTsKLQkJc3ViZGlyMy5ta2RpcigpOwotCQlGaWxlIGZpbGUzYSA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2EiKTsKLQkJZmlsZTNhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlM2IgPSBuZXcgRmlsZShzdWJkaXIzLCAiZmlsZTNiIik7Ci0JCWZpbGUzYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsZXRlRGlyKEZpbGUgZGlyKSB7Ci0JCUZpbGVUb29scy5kZWxldGVEaXJlY3RvcnkoZGlyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0M2FkNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBGaWx0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCIiKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiZm9vIikpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImJhciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEZpbHRlcl90b1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWx0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxGaWx0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGZpbHRlciwgVGVzdFRvb2xzLnNlcmlhbGl6ZShmaWx0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiZm9vIikpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUZpbHRlcl90b1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGZpbHRlciwgVGVzdFRvb2xzLnNlcmlhbGl6ZShmaWx0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCJmb28iKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkRmlsdGVyX3RvU3RyaW5nKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWx0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWFzc2VydFNhbWUoZmlsdGVyLCBUZXN0VG9vbHMuc2VyaWFsaXplKGZpbHRlcikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWY1NWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBIYXNoQmFnPFN0cmluZz4gYmFnOwotCi0JcHVibGljIEhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWIuYWRkKG51bGwpOwotCQliLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KGMpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZCgiZml2ZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCXRoaXMuYmFnLmFkZCgibWludXMzIiwgLTMpOwotCQl0aGlzLmJhZy5hZGQoInplcm8iLCAwKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIiwgNSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm1pbnVzMyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0KLQkJdGhpcy5iYWcuYWRkKCJ0aHJlZSIsIDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5hZGRBbGwoYykpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobmV3IFN0cmluZygiZm91ciIpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvIiArICJ1ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobmV3IFN0cmluZygib25lIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQliYWcyLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYmFnMikpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJhZyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUl0ZXJhdG9yKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhImZvdXIiLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxCYWcuRW50cnk8U3RyaW5nPj4gaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlCYWcuRW50cnk8U3RyaW5nPiBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmdldEVsZW1lbnQoKS5lcXVhbHMoImZvdXIiKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLS8vVE9ETyAtIHBvb3IgbG9hZCBmYWN0b3IgaXMgc2VlbiBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCBmb3Igc29tZSByZWFzb24KLS8vCXB1YmxpYyB2b2lkIHRlc3RIYXNoaW5nRGlzdHJpYnV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJQmFnPFN0cmluZz4gYmlnQmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotLy8JCQliaWdCYWcuYWRkKCJvYmplY3QiICsgaSk7Ci0vLwkJfQotLy8KLS8vCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGJpZ0JhZy5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoInRhYmxlIik7Ci0vLwkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLS8vCQlPYmplY3RbXSB0YWJsZSA9IChPYmplY3RbXSkgZmllbGQuZ2V0KGJpZ0JhZyk7Ci0vLwkJaW50IGJ1Y2tldENvdW50ID0gdGFibGUubGVuZ3RoOwotLy8JCWludCBmaWxsZWRCdWNrZXRDb3VudCA9IDA7Ci0vLwkJZm9yIChPYmplY3QgbyA6IHRhYmxlKSB7Ci0vLwkJCWlmIChvICE9IG51bGwpIHsKLS8vCQkJCWZpbGxlZEJ1Y2tldENvdW50Kys7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZmxvYXQgbG9hZEZhY3RvciA9ICgoZmxvYXQpIGZpbGxlZEJ1Y2tldENvdW50KSAvICgoZmxvYXQpIGJ1Y2tldENvdW50KTsKLS8vCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPiAwLjIwKTsKLS8vCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPCAwLjc1KTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgib25lIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJmb3VyIikpOwotCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBiYWcyKSB7Ci0JCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJbnVsbENvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJvbmUiKSkgewotCQkJCW9uZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0d28iKSkgewotCQkJCXR3b0NvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdGhyZWVDb3VudCsrOwotCQkJfSBlbHNlIGlmIChzLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJZm91ckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1sxMl07Ci0JCWFbMTFdID0gIm5vdCBudWxsIjsKLQkJU3RyaW5nW10gYiA9IHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JCWFzc2VydEVxdWFscyhhLCBiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKGFbMTFdID09IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDExZGY0Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSWRlbnRpdHlIYXNoQmFnOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIElkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzsKLQlwcml2YXRlIFN0cmluZyBvbmUgPSAib25lIjsKLQlwcml2YXRlIFN0cmluZyB0d28gPSAidHdvIjsKLQlwcml2YXRlIFN0cmluZyB0aHJlZSA9ICJ0aHJlZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm91ciA9ICJmb3VyIjsKLQlwcml2YXRlIFN0cmluZyBmb28gPSAiZm9vIjsKLQlwcml2YXRlIFN0cmluZyBiYXIgPSAiYmFyIjsKLQotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiByZXN1bHQgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZChudWxsKTsKLQkJcmVzdWx0LmFkZCh0aGlzLm9uZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50d28pOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnRocmVlKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnRocmVlKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnRocmVlKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDdG9yQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBsb2NhbEJhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPihjKTsKLQkJZm9yIChTdHJpbmcgcyA6IGMpIHsKLQkJCWFzc2VydFRydWUobG9jYWxCYWcuY29udGFpbnMocykpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuYWRkKGZpdmUpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKGZpdmUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQlTdHJpbmcgbWludXMzID0gIm1pbnVzMyI7Ci0JCVN0cmluZyB6ZXJvID0gInplcm8iOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQl0aGlzLmJhZy5hZGQobWludXMzLCAtMyk7Ci0JCXRoaXMuYmFnLmFkZCh6ZXJvLCAwKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUsIDUpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKG1pbnVzMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh6ZXJvKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCh0aGlzLm9uZSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQodGhpcy50d28pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KHRoaXMuZm91cikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoZml2ZSkpOwotCi0JCXRoaXMuYmFnLmFkZCh0aGlzLnRocmVlLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KHRoaXMudGhyZWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuYWRkQWxsKGMpKTsKLQkJZm9yIChTdHJpbmcgcyA6IGMpIHsKLQkJCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMocykpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCB0aGlzLmJhZy5zaXplKCkpOwotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYWQgY2xvbmUiLCB0aGlzLmJhZywgYmFnMik7Ci0JCWFzc2VydFRydWUoImJhZCBjbG9uZSIsIHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKG5ldyBTdHJpbmcoImZvdXIiKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZCh0aGlzLnR3byk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQljLmFkZCh0aGlzLmZvdXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQkJYy5hZGQobmV3IFN0cmluZyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnNBbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmFnMiA9IHRoaXMuYnVpbGRCYWcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFnLCBiYWcyKTsKLQkJYmFnMi5hZGQoImZpdmUiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGJhZzIpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5iYWcpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZy5oYXNoQ29kZSgpLCBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJdGVyYXRvcigpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQkKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMTEsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuYmFnLnNpemUoKSk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhdGhpcy5mb3VyLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyaWVzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZy5FbnRyeTxTdHJpbmc+PiBpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCW9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZy5FbnRyeTxTdHJpbmc+IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZ2V0RWxlbWVudCgpLmVxdWFscyh0aGlzLmZvdXIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JLy8gQ29tbWVudGluZyBvdXQgdGhpcyB0ZXN0IGFzIGl0IGlzIGFsc28gZmFpbGluZyBpbiB0aGUgRWNsaXBzZSBidWlsZAotCS8vIGFwcGFyZW5seSB0aGVyZSBhcmUgc29tZSBoYXNoaW5nIGlzc3VlcyB0aGF0IG5lZWQgdG8gYmUgbG9va2VkIGludG8uCi0vLwlwdWJsaWMgdm9pZCB0ZXN0SGFzaGluZ0Rpc3RyaWJ1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJpZ0JhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPigpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotLy8JCQliaWdCYWcuYWRkKCJvYmplY3QiICsgaSk7Ci0vLwkJfQotLy8JCi0vLwkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBiaWdCYWcuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJ0YWJsZSIpOwotLy8JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0vLwkJT2JqZWN0W10gdGFibGUgPSAoT2JqZWN0W10pIGZpZWxkLmdldChiaWdCYWcpOwotLy8JCWludCBidWNrZXRDb3VudCA9IHRhYmxlLmxlbmd0aDsKLS8vCQlpbnQgZmlsbGVkQnVja2V0Q291bnQgPSAwOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVja2V0Q291bnQ7IGkrKykgewotLy8JCQlpZiAodGFibGVbaV0gIT0gbnVsbCkgewotLy8JCQkJZmlsbGVkQnVja2V0Q291bnQrKzsKLS8vCQkJfQotLy8JCX0KLS8vCQlmbG9hdCBsb2FkRmFjdG9yID0gKChmbG9hdCkgZmlsbGVkQnVja2V0Q291bnQpLygoZmxvYXQpIGJ1Y2tldENvdW50KTsKLS8vCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImxvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3RvciArICIgKCIgKyBmaWxsZWRCdWNrZXRDb3VudCArICIvIiArIGJ1Y2tldENvdW50ICsgIikiKTsKLS8vCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPiAwLjIwKTsKLS8vCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPCAwLjc1KTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKG5ldyBTdHJpbmcodGhpcy50aHJlZSkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvdW50KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUsIDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgLTMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUsIDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQobmV3IFN0cmluZyh0aGlzLnR3bykpOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmVBbGwoYykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQobmV3IFN0cmluZyh0aGlzLnR3bykpOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuc2l6ZSgpID09IDExKTsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKG5ldyBTdHJpbmcoZml2ZSkpOwotCQlhc3NlcnRFcXVhbHMoMTYsIHRoaXMuYmFnLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYmFnKTsKLQkKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZy5pdGVyYXRvcigpKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpKTsKLQkJLy8gbG9vayBmb3Igc2ltaWxhciBlbGVtZW50cwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoImZvdXIiKSk7Ci0JCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIG5leHQgOiBiYWcyKSB7Ci0JCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCW51bGxDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoIm9uZSIpKQotCQkJCW9uZUNvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygidHdvIikpCi0JCQkJdHdvQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJ0aHJlZSIpKQotCQkJCXRocmVlQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJmb3VyIikpCi0JCQkJZm91ckNvdW50Kys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5iYWcudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5mb3VyKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzEyXTsKLQkJYVsxMV0gPSAibm90IG51bGwiOwotCQlTdHJpbmdbXSBiID0gdGhpcy5iYWcudG9BcnJheShhKTsKLQkJYXNzZXJ0RXF1YWxzKGEsIGIpOwotCQlhc3NlcnRFcXVhbHMoMTIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5mb3VyKSk7Ci0JCWFzc2VydFRydWUoYVsxMV0gPT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBudW1iZXIgb2YgY29tbWFzIiwgMTAsIGNvbW1hQ291bnQpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigib25lIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidHdvIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidGhyZWUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJmb3VyIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigibnVsbCIpICE9IC0xKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTA2NGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlTdHJpbmdXcml0ZXIgc3cxOwotCVN0cmluZ1dyaXRlciBzdzI7Ci0JSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3MTsKLQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcyOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3cxID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0aGlzLmlwdzEgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIodGhpcy5zdzEpOwotCQl0aGlzLnN3MiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdGhpcy5pcHcyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHRoaXMuc3cyLCAiICAgICIpOyAvLyBpbmRlbnQgd2l0aCA0IHNwYWNlcyBpbnN0ZWFkIG9mIGEgdGFiCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUYWIoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRcdGZvbzIiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3MS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRTcGFjZXMoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICAgICAgZm9vMiIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3Mi5pbmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLmluZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzIudW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi51bmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3Mi50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW50UmVmZXJlbmNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW50UmVmZXJlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkZTM3Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ludFJlZmVyZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbnRSZWZlcmVuY2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEludFJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEludFJlZmVyZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ycygpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEVxdWFscyg3LCBpci5nZXRWYWx1ZSgpKTsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC03LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmVxdWFscygwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmVxdWFscyg3KSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmVxdWFscyg3KSk7Ci0JCWFzc2VydEZhbHNlKGlyLmVxdWFscygwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsc0ludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIubm90RXF1YWxzKDApKTsKLQkJYXNzZXJ0VHJ1ZShpci5ub3RFcXVhbHMoNykpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIubm90RXF1YWxzKDcpKTsKLQkJYXNzZXJ0VHJ1ZShpci5ub3RFcXVhbHMoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1plcm8oKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNaZXJvKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFplcm8oKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTm90WmVybygpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3RaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzR3JlYXRlclRoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNHcmVhdGVyVGhhbigwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzR3JlYXRlclRoYW4oNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuT3JFcXVhbEludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKGlyLmlzR3JlYXRlclRoYW5PckVxdWFsKDApKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNHcmVhdGVyVGhhbk9yRXF1YWwoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc0xlc3NUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTGVzc1RoYW4oMCkpOwotCQlhc3NlcnRUcnVlKGlyLmlzTGVzc1RoYW4oNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuT3JFcXVhbEludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNMZXNzVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0xlc3NUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydFRydWUoaXIuaXNMZXNzVGhhbk9yRXF1YWwoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1Bvc2l0aXZlKCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzUG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzUG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmlzUG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90UG9zaXRpdmUoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdFBvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90UG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5pc05vdFBvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05lZ2F0aXZlKCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90TmVnYXRpdmUoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOb3ROZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdE5lZ2F0aXZlKCkpOwotCi0JCWlyID0gbmV3IEludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdE5lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLnNldFZhbHVlKDQpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnMoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmFicygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCi0JCWlyLnNldFZhbHVlKDMpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5hYnMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnKCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5uZWcoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQotCQlpci5zZXRWYWx1ZSgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLm5lZygpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0WmVybygpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLnNldFplcm8oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCB2YWx1ZTsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQl2YWx1ZSA9IGlyLmFkZCgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCi0JCXZhbHVlID0gaXIuYWRkKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC00LCB2YWx1ZSk7Ci0JCWFzc2VydEVxdWFscygtNCwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluY3JlbWVudCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgdmFsdWU7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdmFsdWUgPSBpci5pbmNyZW1lbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdEludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgY291bnQ7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJY291bnQgPSBpci5zdWJ0cmFjdCgzKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBjb3VudCk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJY291bnQgPSBpci5zdWJ0cmFjdCgtNyk7Ci0JCWFzc2VydEVxdWFscyg0LCBjb3VudCk7Ci0JCWFzc2VydEVxdWFscyg0LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCBjb3VudDsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQljb3VudCA9IGlyLmRlY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHlJbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDMpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBpci5tdWx0aXBseSgzKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlSW50KCkgewotCQlJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IEludFJlZmVyZW5jZSgyNCk7Ci0JCWFzc2VydEVxdWFscygyNCwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBpci5kaXZpZGUoMykpOwotCQlhc3NlcnRFcXVhbHMoOCwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbWFpbmRlckludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoMjUpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXIucmVtYWluZGVyKDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnQoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDI1KTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLm1pbigzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLm1pbigyNSkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoMjUpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLm1heCgzKSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzMCwgaXIubWF4KDMwKSk7Ci0JCWFzc2VydEVxdWFscygzMCwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBvd0ludCgpIHsKLQkJSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBJbnRSZWZlcmVuY2UoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5wb3coMikpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoNjI1LCBpci5wb3coMikpOwotCQlhc3NlcnRFcXVhbHMoNjI1LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvSW50UmVmZXJlbmNlKCkgewotCQlJbnRSZWZlcmVuY2UgaXIxID0gbmV3IEludFJlZmVyZW5jZSg0NCk7Ci0JCUludFJlZmVyZW5jZSBpcjIgPSBuZXcgSW50UmVmZXJlbmNlKDQ0KTsKLQkJYXNzZXJ0VHJ1ZShpcjEuY29tcGFyZVRvKGlyMikgPT0gMCk7Ci0JCWlyMiA9IG5ldyBJbnRSZWZlcmVuY2UoNTUpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA8IDApOwotCQlpcjIgPSBuZXcgSW50UmVmZXJlbmNlKDMzKTsKLQkJYXNzZXJ0VHJ1ZShpcjEuY29tcGFyZVRvKGlyMikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjEgPSBuZXcgSW50UmVmZXJlbmNlKDQ0KTsKLQkJSW50UmVmZXJlbmNlIGlyMiA9IChJbnRSZWZlcmVuY2UpIGlyMS5jbG9uZSgpOwotCQlhc3NlcnRFcXVhbHMoNDQsIGlyMi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGlyMSwgaXIyKTsKLQkJYXNzZXJ0Tm90U2FtZShpcjEsIGlyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJSW50UmVmZXJlbmNlIGlyMSA9IG5ldyBJbnRSZWZlcmVuY2UoNDQpOwotCQlJbnRSZWZlcmVuY2UgaXIyID0gbmV3IEludFJlZmVyZW5jZSg0NCk7Ci0JCWFzc2VydEVxdWFscyhpcjEsIGlyMik7Ci0JCWFzc2VydEVxdWFscyhpcjEuaGFzaENvZGUoKSwgaXIyLmhhc2hDb2RlKCkpOwotCQlhc3NlcnRGYWxzZShpcjEuZXF1YWxzKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJbnRSZWZlcmVuY2UgaXIxID0gbmV3IEludFJlZmVyZW5jZSg0NCk7Ci0JCUludFJlZmVyZW5jZSBpcjIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGlyMSk7Ci0JCWFzc2VydEVxdWFscyg0NCwgaXIyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoaXIxLCBpcjIpOwotCQlhc3NlcnROb3RTYW1lKGlyMSwgaXIyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgSW50UmVmZXJlbmNlKDUpOwotCQlhc3NlcnRFcXVhbHMoIls1XSIsIGlyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkYWQxOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSkRCQ1R5cGU7Ci0KLXB1YmxpYyBjbGFzcyBKREJDVHlwZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEpEQkNUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVzU2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoLCBKREJDVHlwZS50eXBlcygpLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIGpkYmNUeXBlLm5hbWUoKSk7Ci0KLQkJamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKFR5cGVzLklOVEVHRVIpOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBqZGJjVHlwZS5uYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlKCkgewotCQlKREJDVHlwZSBqZGJjVHlwZTsKLQkJamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKFR5cGVzLlZBUkNIQVIpOwotCQlhc3NlcnRFcXVhbHMoVHlwZXMuVkFSQ0hBUiwgamRiY1R5cGUuY29kZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5JTlRFR0VSLCBqZGJjVHlwZS5jb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHlwZUNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSkRCQ1R5cGUgamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKDU1KTsKLQkJCWZhaWwoImludmFsaWQgSkRCQ1R5cGU6ICIgKyBqZGJjVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSkRCQ1R5cGUgamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKCJWQVJDSEFSMiIpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0phdmFUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGExOTViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFUeXBlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSmF2YVR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVsZW1lbnRUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShudWxsLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiIiwgMCk7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVsZW1lbnRUeXBlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSwgMCk7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFycmF5RGVwdGhOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgLTIpOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRWb2lkQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcy5nZXROYW1lKCksIDIpOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoaW50LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoaW50W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyh2b2lkLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SmF2YUNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyk7Ci0JCWFzc2VydEVxdWFscyhqYXZhQ2xhc3MsIGphdmFUeXBlLmdldEphdmFDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5PYmplY3Q7IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltJIiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwJEVudHJ5IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS51dGlsLk1hcCRFbnRyeTsiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGludC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGludFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXModm9pZC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlc2NyaWJlcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhQ2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjbGFyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3RbXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAuRW50cnkiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcmltaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pwdFV0aWxpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRVdGlsaXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhODgyMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pwdFV0aWxpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnMuSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlcy5KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzLkpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5KcHRVdGlsaXR5TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlLkpwdFV0aWxpdHlOb2RlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuc3luY2hyb25pemVycy5KcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU5vZGVUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzLnN1aXRlKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQml0VG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCb29sZWFuUmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbW1hbmRFeGVjdXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbW1hbmRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeGNlcHRpb25IYW5kbGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsZVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElkZW50aXR5SGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW50UmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKREJDVHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RlbmVyTGlzdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFNpZ25hdHVyZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5vdE51bGxGaWx0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPYmplY3RSZWZlcmVuY2VUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSYW5nZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJldmVyc2VDb21wYXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVRdWV1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVN0YWNrVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkSW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkT2JqZWN0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkUXVldWVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhNTFN0cmluZ0VuY29kZXJUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlYTMxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0xpc3RlbmVyTGlzdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJMaXN0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTGlzdGVuZXJMaXN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJSXRlcmFibGU8TGlzdGVuZXI+IGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGxpc3RlbmVycykpOwotCi0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShsaXN0ZW5lcnMpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJzLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJzLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5zaXplKCkpOwotCi0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWFzc2VydFRydWUobGlzdGVuZXJMaXN0LmlzRW1wdHkoKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRfbnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LmFkZChudWxsKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZF9kdXBsaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMSk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QucmVtb3ZlKG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBsaXN0ZW5lciBsaXN0OiAiICsgbGlzdGVuZXJMaXN0KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX3VucmVnaXN0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5jbGVhcigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0JfQotCi0vL1RPRE8gLSBUaGlzIHRlc3QgZG9lc24ndCBwYXNzIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IChMaW51eCkgZm9yIHNvbWUgcmVhc29uCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotLy8JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0vLwkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLS8vCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMSk7Ci0vLwkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotLy8KLS8vCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGxpc3RlbmVyTGlzdCk7Ci0vLwkJYXNzZXJ0Tm90U2FtZShsaXN0ZW5lckxpc3QsIGxpc3RlbmVyTGlzdDIpOwotLy8JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3QyLnNpemUoKSk7Ci0vLwotLy8JCUxpc3RlbmVyIGxpc3RlbmVyMyA9IG5ldyBOb25TZXJpYWxpemFibGVMaXN0ZW5lcigpOwotLy8JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIzKTsKLS8vCi0vLwkJbGlzdGVuZXJMaXN0MiA9IFRlc3RUb29scy5zZXJpYWxpemUobGlzdGVuZXJMaXN0KTsKLS8vCQlhc3NlcnROb3RTYW1lKGxpc3RlbmVyTGlzdCwgbGlzdGVuZXJMaXN0Mik7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGxpc3RlbmVyTGlzdDIuc2l6ZSgpKTsKLS8vCi0vLwl9Ci0KLQlpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTm9uU2VyaWFsaXphYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNvbWV0aGluZ0hhcHBlbmVkKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFhZTUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1ldGhvZFNpZ25hdHVyZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE1ldGhvZFNpZ25hdHVyZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoKFN0cmluZykgbnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmFtZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCIiKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChKYXZhVHlwZVtdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgSmF2YVR5cGVbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzVm9pZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUganQgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcy5nZXROYW1lKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IEphdmFUeXBlW10ge2p0fSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZU5hbWVzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKFN0cmluZ1tdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlTmFtZXNOdWxsSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IFN0cmluZ1sxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVySmF2YUNsYXNzZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoQ2xhc3M8Pz5bXSkgbnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVySmF2YUNsYXNzZXNOdWxsSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IENsYXNzWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QwKCkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QxKGludCkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QyKGludCwgamF2YS5sYW5nLlN0cmluZykiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QzKGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdW10pIiwgbXMuZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDIiKSk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kMiIsIG1zLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFBhcmFtZXRlclR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCUphdmFUeXBlW10gZXhwZWN0ZWQgPSBuZXcgSmF2YVR5cGVbM107Ci0JCWV4cGVjdGVkWzBdID0gbmV3IFNpbXBsZUphdmFUeXBlKCJpbnQiKTsKLQkJZXhwZWN0ZWRbMV0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLQkJZXhwZWN0ZWRbMl0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImphdmEubGFuZy5PYmplY3QiLCAyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBtcy5nZXRQYXJhbWV0ZXJUeXBlcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgbXMxID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJT2JqZWN0IG1zMiA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczEpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLmhhc2hDb2RlKCksIG1zMi5oYXNoQ29kZSgpKTsKLQotCQlPYmplY3QgbXMzID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMyk7Ci0JCWFzc2VydEZhbHNlKG1zMS5lcXVhbHMobXMzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlTaW1wbGVNZXRob2RTaWduYXR1cmUgbXMyID0gKFNpbXBsZU1ldGhvZFNpZ25hdHVyZSkgbXMxLmNsb25lKCk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlTaW1wbGVNZXRob2RTaWduYXR1cmUgbXMyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShtczEpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMyKTsKLQkJYXNzZXJ0RXF1YWxzKG1zMSwgbXMyKTsKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRDbGFzcygpLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2Qgbm90IGZvdW5kOiAiICsgbWV0aG9kTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWV0aG9kMCgpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZDEoaW50IGZvbykgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kMihpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2QzKGludCBmb28sIFN0cmluZyBiYXIsIE9iamVjdFtdW10gYmF6KSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZEEoaW50IGZvbywgU3RyaW5nIGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQShpbnQgZm9vLCBTdHJpbmcgYmFyLCBTdHJpbmcgYmF6KSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZEIoaW50IGZvbywgT2JqZWN0IGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQihpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODk1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOYW1lVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBOYW1lVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQWJzZW50SWdub3JlQ2FzZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUYXVwZSIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiVGF1cGUiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRDYXNlRGlmZmVycygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoImdyZWVuIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJncmVlbiIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudElnbm9yZUNhc2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiZ3JlZW4iLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImdyZWVuMiIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudFdpdGhBcHBlbmRpY2VzKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJSZWQxIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoInJlZDIiKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJyZWQiLCBjb2xvckNvbGxlY3Rpb24pOwotCQljb2xvckNvbGxlY3Rpb24ucmVtb3ZlKCJSZWQxIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5yZW1vdmUoInJlZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWQzIiwgcmV0dXJuZWQpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ29sb3JDb2xsZWN0aW9uKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlJlZCIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJPcmFuZ2UiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiWWVsbG93Iik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkdyZWVuIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkJsdWUiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiSW5kaWdvIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlZpb2xldCIpOwotCQlyZXR1cm4gY29sb3JDb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlMSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2wiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MpKTsKLQotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlMSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2wiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImNhdGFsb2cuc2NoZW1hLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoImNhdGFsb2ciLCAic2NoZW1hIiwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygiY2F0YWxvZy4ubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgiY2F0YWxvZyIsIG51bGwsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoInNjaGVtYS5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsICJzY2hlbWEiLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsIG51bGwsICJuYW1lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJjbGFzcyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAiQ2xhc3MiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAicHJpdmF0ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Y29udmVydFRvSmF2YUlkZW50aWZpZXJTdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcml2YXRlXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInRocm93IikpOwotCQlhc3NlcnRFcXVhbHMoIl9mb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fX2Jhcl9fIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28gIGJhciAgIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rjb252ZXJ0VG9KYXZhSWRlbnRpZmllclN0cmluZ0NoYXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28xIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygicHJpdmF0ZSQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd3NzIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJ0aHJvdyIsICdzJykpOwotCQlhc3NlcnRFcXVhbHMoIiRmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28kIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vJCRiYXIkJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vICBiYXIgICIsICckJykpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIiwgJzcnKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCc3JykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCkgewotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJjbGFzcyIpKTsKLQkJYXNzZXJ0VHJ1ZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJjbGFzUyIpKTsKLQotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCI3Zm9vIikpOwotCQlhc3NlcnRGYWxzZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJmb29AYmFyIikpOwotCQlhc3NlcnRUcnVlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoIl9mb28iKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05vdE51bGxGaWx0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwOTJmNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05vdE51bGxGaWx0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOb3ROdWxsRmlsdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTm90TnVsbEZpbHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3ROdWxsRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBOb3ROdWxsRmlsdGVyLmluc3RhbmNlKCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiIikpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJmb28iKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiYmFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gTm90TnVsbEZpbHRlci5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvT2JqZWN0UmVmZXJlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNzQ3Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL09iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk9iamVjdFJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0UmVmZXJlbmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgT2JqZWN0UmVmZXJlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnROdWxsKG9yLmdldFZhbHVlKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRXF1YWxzT2JqZWN0KCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRUcnVlKG9yLnZhbHVlRXF1YWxzKG51bGwpKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVFcXVhbHMoImZvbyIpKTsKLQotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9yLnZhbHVlRXF1YWxzKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZUVxdWFscygiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU5vdEVxdWFsT2JqZWN0KCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZU5vdEVxdWFsKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZU5vdEVxdWFsKCJmb28iKSk7Ci0KLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9yLnZhbHVlTm90RXF1YWwobnVsbCkpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZU5vdEVxdWFsKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTnVsbCgpIHsKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0VHJ1ZShvci5pc051bGwoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3IuaXNOdWxsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdE51bGwoKSB7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IE9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKG9yLmlzTm90TnVsbCgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9yLmlzTm90TnVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbCgpIHsKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0TnVsbChvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9yLmdldFZhbHVlKCkpOwotCQlvci5zZXROdWxsKCk7Ci0JCWFzc2VydE51bGwob3IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gY2xvbmUgPSAoT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4pIG9yLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xvbmUuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvciwgY2xvbmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yMSA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yMiA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCWFzc2VydFRydWUob3IxLmVxdWFscyhvcjIpKTsKLQkJT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IzID0gbmV3IE9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2Uob3IxLmVxdWFscyhvcjMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IE9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygwLCBvci5oYXNoQ29kZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIuaGFzaENvZGUoKSwgb3IuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoIltudWxsXSIsIG9yLnRvU3RyaW5nKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiW2Zvb10iLCBvci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjJjY2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSYW5nZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlcygpIHsKLQkJUmFuZ2UgcmFuZ2UgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygtNTUpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoMCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcyg0KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoNSkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNikpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDE3KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDE4KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDIwMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoMTcsIDUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCQkvLyBhbHRob3VnaCB0aGV5IGFyZSB1bmVxdWFsLCB0aGV5IGNhbiBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZQotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gcmFuZ2UxLmNsb25lKCk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHJhbmdlMSk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTAwZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLQotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gbmF0dXJhbFJldmVyc2VDb21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbUNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvciA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuY3VzdG9tQ29tcGFyYXRvciA9IHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCk7Ci0JCXRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPih0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlTdHJpbmcgbG93ZXIxID0gczEudG9Mb3dlckNhc2UoKTsKLQkJCQlTdHJpbmcgbG93ZXIyID0gczIudG9Mb3dlckNhc2UoKTsKLQkJCQlpbnQgcmVzdWx0ID0gbG93ZXIxLmNvbXBhcmVUbyhsb3dlcjIpOwotCQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsgLy8gdXNlIGNhc2UgdG8gZGlmZmVyZW50aWF0ZSAiZXF1YWwiIHN0cmluZ3MKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFVuc29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJUIik7Ci0JCXJlc3VsdC5hZGQoIloiKTsKLQkJcmVzdWx0LmFkZCgiWSIpOwotCQlyZXN1bHQuYWRkKCJNIik7Ci0JCXJlc3VsdC5hZGQoIm0iKTsKLQkJcmVzdWx0LmFkZCgiYSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoImIiKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTmF0dXJhbGx5U29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYnVpbGRVbnNvcnRlZExpc3QoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCB0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmF0dXJhbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5jdXN0b21SZXZlcnNlQ29tcGFyYXRvcik7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpLCBsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChMaXN0PFN0cmluZz4gbm9ybWFsLCBMaXN0PFN0cmluZz4gcmV2ZXJzZSkgewotCQlpbnQgc2l6ZSA9IG5vcm1hbC5zaXplKCk7Ci0JCWludCBtYXggPSBzaXplIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhub3JtYWwuZ2V0KGkpLCByZXZlcnNlLmdldChtYXggLSBpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQyNWY5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTaW1wbGVBc3NvY2lhdGlvblRlc3RzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5hc3NvYyA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oImZvbyIsICJiYXIiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEtleSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFzc29jLmtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hc3NvYy52YWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hc3NvYy52YWx1ZSgpKTsKLQkJdGhpcy5hc3NvYy5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5hc3NvYy52YWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYywgdGhpcy5jb3B5KHRoaXMuYXNzb2MpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9vIiwgImJheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQotCQlhc3NvYzIgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb3AiLCAiYmFyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYXNzb2MuZXF1YWxzKGFzc29jMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MuaGFzaENvZGUoKSwgdGhpcy5jb3B5KHRoaXMuYXNzb2MpLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJdGhpcy52ZXJpZnlDbG9uZSh0aGlzLmFzc29jLCB0aGlzLmFzc29jLmNsb25lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWQsIEFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQlhc3NlcnROb3RTYW1lKGV4cGVjdGVkLCBhY3R1YWwpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQua2V5KCksIGFjdHVhbC5rZXkoKSk7Ci0JCWFzc2VydFNhbWUoZXhwZWN0ZWQua2V5KCksIGFjdHVhbC5rZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC52YWx1ZSgpLCBhY3R1YWwudmFsdWUoKSk7Ci0JCWFzc2VydFNhbWUoZXhwZWN0ZWQudmFsdWUoKSwgYWN0dWFsLnZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKLQkJQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IChBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4pIFRlc3RUb29scy5zZXJpYWxpemUodGhpcy5hc3NvYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MsIGFzc29jMik7Ci0JCWFzc2VydE5vdFNhbWUodGhpcy5hc3NvYywgYXNzb2MyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2Mua2V5KCksIGFzc29jMi5rZXkoKSk7Ci0JCWFzc2VydE5vdFNhbWUodGhpcy5hc3NvYy5rZXkoKSwgYXNzb2MyLmtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MudmFsdWUoKSwgYXNzb2MyLnZhbHVlKCkpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2MudmFsdWUoKSwgYXNzb2MyLnZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGNvcHkoU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IHNhKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KHNhLmtleSgpLCBzYS52YWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlUXVldWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzYwMzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVF1ZXVlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2ltcGxlUXVldWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlRdWV1ZTxTdHJpbmc+IGJ1aWxkUXVldWUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUXVldWU8U3RyaW5nPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCWFzc2VydFRydWUocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJYXNzZXJ0RmFsc2UocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZW5xdWV1ZSgic2Vjb25kIik7Ci0JCWFzc2VydEZhbHNlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmRlcXVldWUoKTsKLQkJYXNzZXJ0RmFsc2UocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZGVxdWV1ZSgpOwotCQlhc3NlcnRUcnVlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVucXVldWVBbmREZXF1ZXVlKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVucXVldWVBbmRQZWVrKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVF1ZXVlRXhjZXB0aW9uUGVlaygpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcXVldWUucGVlaygpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UXVldWVFeGNlcHRpb25EZXF1ZXVlKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUuZGVxdWV1ZSgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlxdWV1ZS5kZXF1ZXVlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZVF1ZXVlPFN0cmluZz4gcXVldWUgPSAoU2ltcGxlUXVldWU8U3RyaW5nPikgdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCXF1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCXF1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUocXVldWUsIHF1ZXVlLmNsb25lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJcXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJcXVldWUuZW5xdWV1ZSgic2Vjb25kIik7Ci0JCXF1ZXVlLmVucXVldWUoInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShxdWV1ZSwgVGVzdFRvb2xzLnNlcmlhbGl6ZShxdWV1ZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShRdWV1ZTxTdHJpbmc+IG9yaWdpbmFsLCBRdWV1ZTxTdHJpbmc+IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmRlcXVldWUoKSwgY2xvbmUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmRlcXVldWUoKSwgY2xvbmUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmRlcXVldWUoKSwgY2xvbmUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCi0JCW9yaWdpbmFsLmVucXVldWUoImZvdXJ0aCIpOwotCQlhc3NlcnRGYWxzZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQkvLyBjbG9uZSBzaG91bGQgc3RpbGwgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVN0YWNrVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzZGU3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVN0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGFja1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZVN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JU3RhY2s8U3RyaW5nPiBidWlsZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlhc3NlcnRUcnVlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wb3AoKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucG9wKCk7Ci0JCWFzc2VydFRydWUoc3RhY2suaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFuZFBvcCgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFuZFBlZWsoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0YWNrRXhjZXB0aW9uUGVlaygpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0YWNrLnBlZWsoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0YWNrRXhjZXB0aW9uUG9wKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RhY2sucG9wKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZVN0YWNrPFN0cmluZz4gc3RhY2sgPSAoU2ltcGxlU3RhY2s8U3RyaW5nPikgdGhpcy5idWlsZFN0YWNrKCk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlzdGFjay5wdXNoKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoc3RhY2ssIHN0YWNrLmNsb25lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJc3RhY2sucHVzaCgiZmlyc3QiKTsKLQkJc3RhY2sucHVzaCgic2Vjb25kIik7Ci0JCXN0YWNrLnB1c2goInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShzdGFjaywgVGVzdFRvb2xzLnNlcmlhbGl6ZShzdGFjaykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShTdGFjazxTdHJpbmc+IG9yaWdpbmFsLCBTdGFjazxTdHJpbmc+IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCi0JCW9yaWdpbmFsLnB1c2goImZvdXJ0aCIpOwotCQlhc3NlcnRGYWxzZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQkvLyBjbG9uZSBzaG91bGQgc3RpbGwgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3OGRjYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3RyaW5nVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTdHJpbmdUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBTdHJpbmcoYWN0dWFsKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwYWRkaW5nL3RydW5jYXRpbmcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFBhZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZCgiZnJlZCIsIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJmciIsIFN0cmluZ1Rvb2xzLnBhZCgiZnJlZCIsIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZENoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCJmciIsIFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9uV3JpdGVyKCkgewotCQlXcml0ZXIgd3JpdGVyOwotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgMiwgd3JpdGVyKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9uU3RyaW5nQnVmZmVyKCkgewotCQlTdHJpbmdCdWZmZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJU3RyaW5nQnVpbGRlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZSgiZnJlZCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgNikpOwotCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZSgiZnJlZCIsIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNikpOwotCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoImZyZWQiLCAiZnJlZCIsIDQpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoImZyIiwgImZyZWQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoImZyZWQiLCAiZnJlZCIsIDQpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWQoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQoIjEyMzQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxMiIsIFN0cmluZ1Rvb2xzLnplcm9QYWQoIjEyMzQiLCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiMTIiLCBTdHJpbmdUb29scy56ZXJvUGFkKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uV3JpdGVyKCkgewotCQlXcml0ZXIgd3JpdGVyOwotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgMiwgd3JpdGVyKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPblN0cmluZ0J1ZmZlcigpIHsKLQkJU3RyaW5nQnVmZmVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25TdHJpbmdCdWlsZGVyKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUoIjEyMzQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUoIjEyMzQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNikpOwotCQlhc3NlcnRFcXVhbHMoIjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoIjEyMzQiLCAiMTIzNCIsIDQpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMzQiLCAiMTIzNCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjEyMzQiLCAiMTIzNCIsIDQpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdCgpIHsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0KCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0KCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXQoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlbGltaXQoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0T25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uV3JpdGVyKCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uV3JpdGVyKCIiLCAiMTIzIiwgIjEyMzEyMyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZWxpbWl0T25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGltaXRPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWZmZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5kZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWlsZGVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5kZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGUoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlKCJFbXBcImxveWVlIiwgIlwiRW1wXCJcImxveWVlXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGUoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucXVvdGUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIkVtcFwibG95ZWUiLCAiXCJFbXBcIlwibG95ZWVcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIkVtcFwibG95ZWUiLCAiXCJFbXBcIlwibG95ZWVcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnF1b3RlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbW92aW5nIGNoYXJhY3RlcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2Uoc3RyaW5nLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcudG9DaGFyQXJyYXkoKSwgY2hhclRvUmVtb3ZlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcyhTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgY2hhclRvUmVtb3ZlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZShzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZSgpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlKCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgiXHRFbXBsb3llZSAgXG4iLCAiIEVtcGxveWVlICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZShzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigiXHRFbXBsb3llZSAgXG4iLCAiIEVtcGxveWVlICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2VPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiXHRFbXBsb3llZSAgXG4iLCAiIEVtcGxveWVlICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiXHRFbXBsb3llZSAgXG4iLCAiIEVtcGxveWVlICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb21tb24gcHJlZml4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb21tb25QcmVmaXhMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb29CQkIiKSk7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb29CQkIiKSk7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1vblByZWZpeExlbmd0aE1heCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvb0JCQiIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvb0JCQiIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvbyIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvbyIsIDIpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNhcGl0YWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZVN0cmluZygpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVTdHJpbmcoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuYXBpdGFsaXplQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplU3RyaW5nKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygib3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigib3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRW1wdHlTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgICIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICBcdFx0ICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiICsgU3RyaW5nVG9vbHMuQ1IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChjaGFyW10pIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbFN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoKFN0cmluZykgbnVsbCwgKFN0cmluZykgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobnVsbCwgImFzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIiwgIkFTREYiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChjaGFyW10pIG51bGwsIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiQVNERiIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZVN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChTdHJpbmcpIG51bGwsIChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShudWxsLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGYiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsICJBU0RGIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFTIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJBIikpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImJzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmZ2dnZ2dnIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZUNoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhUyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJic2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnZ2dnZ2ciLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdBJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ0EnKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2InKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNVcHBlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkZPTyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKCJGT08yIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkYgTyBPIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzVXBwZXJjYXNlKCJGb28iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNVcHBlcmNhc2UoIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZSgiZm9vMiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmIG8gbyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0xvd2VyY2FzZSgiRm9vIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzTG93ZXJjYXNlKCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0xvd2VyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydCBjYW1lbC1jYXNlIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCkgewotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0NCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFUyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCAzKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCA1KSk7Ci0JCWFzc2VydEVxdWFscygiVEUiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgOSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA4KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9UIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCAxMTAwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RURVNUVGVzdCIsIDEwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3QiLCAxNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVMiLCAidGVzdCIsIDMpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJURVNUIiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURSIsICJURVNUIiwgMik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTIiwgInRlc3RUZXN0IiwgOCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1QiLCAidGVzdFRlc3QiLCA2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfIiwgInRlc3RUZXN0IiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3RUZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDExMDApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUXyIsICJ0ZXN0VEVTVFRlc3QiLCAxMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiLCAxNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiLCAxNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF8iLCAiVGVzdFRFU1RUZXN0VCIsIDE1KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IG1heCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBtYXgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgbWF4LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF8iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX18iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRlU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VMb3dlcmNhc2UoKSB7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX19fIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX190ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihzdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKHN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1F1b3RlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcImZvb1wiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcIlwiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIlwiIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNRdW90ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc1F1b3RlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1BhcmVudGhldGljYWwoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoZm9vKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiKCIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNCcmFja2V0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZCgiW2Zvb10iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFja2V0ZWQoIltdIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIlsiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQnJhY2VkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFjZWQoIntmb299Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2VkKCJ7fSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCJ7Iik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNCcmFjZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0JyYWNlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0NoZXZyb25lZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKCI8Zm9vPiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0NoZXZyb25lZCgiPD4iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgieyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJmb28iLCAnPycpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/Zm9vPyIsICc/Jyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIiIsICc/Jyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoIlwiXCIiLCAnIicpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/eHg/IiwgJz8nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIj94eF0iLCAnPycpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJcIiIsICciJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCIgIiwgJyAnKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIicnIiwgJyInKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIidmb28nIiwgJz8nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHMsIGNoYXIgYykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIGMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgYykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQyKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoImZvbyIsICdbJywgJ10nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoIntmb299IiwgJ3snLCAnfScpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiIiwgJ1snLCAnXScpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMigiW10iLCAnWycsICddJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKCJbeHhdIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIj94eF0iLCAnWycsICddJyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCJcIiIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCIgIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIicnIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIidmb28nIiwgJ1snLCAnXScpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoU3RyaW5nIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgc3RhcnQsIGVuZCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNEZWxpbWl0ZWQyKFN0cmluZyBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBzdGFydCwgZW5kKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCS8vICoqKioqKioqKiogdW5kZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb1wiXCJvXCIiLCAiZm9cIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiW2Zvb10iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb29cIlwiIiwgImZvb1wiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdChTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdEludCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRJbnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdEludCgiXCJcImZvb1wiXCIiLCAyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0SW50KCInZm9vJyIsIDIsICJvIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdEludChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocywgY291bnQpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpLCBjb3VudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRJbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMuZGVueVVuZGVsaW1pdEludCgiXCJcIiIsIDIpOwotCQl0aGlzLmRlbnlVbmRlbGltaXRJbnQoIidvJyIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55VW5kZWxpbWl0SW50KFN0cmluZyBzLCBpbnQgY291bnQpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIGJvZ3VzID0gU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMsIGNvdW50KTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiAiICsgYm9ndXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhcltdIGJvZ3VzID0gU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMudG9DaGFyQXJyYXkoKSwgY291bnQpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBuZXcgU3RyaW5nKGJvZ3VzKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9cIlwib1wiIiwgImZvXCJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIltmb29dIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJcIiIsICJmb29cIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPbldyaXRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiXCJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJcIlwiIiwgIlwiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cIlwiXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCJcIiIsICJcIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPbldyaXRlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgY291bnQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0aW5nIHRvIEphdmEgc3RyaW5nIGxpdGVyYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHMpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cYmJhciIsICJcImZvb1xcYmJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cXGJhciIsICJcImZvb1xcXFxiYXJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWJjZjNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkQm9vbGVhblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkQm9vbGVhbiBzYjsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZXhDYXVnaHQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc2IgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbigpOwotCQl0aGlzLmV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pcyhmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNOb3QodHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1RydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5mbGlwKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmZsaXAoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5vdFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXROb3QodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm90RmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXROb3QoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRGYWxzZSgpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRUcnVlKCk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleFRoaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0U2FtZSh0aGlzLnNiLCB0aGlzLnNiLmdldE11dGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihtdXRleCk7Ci0JCWFzc2VydFNhbWUobXV0ZXgsIHN5bmNCb29sLmdldE11dGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gc2IyID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oZmFsc2UpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zYiwgc2IyKTsKLQotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmVxdWFscyhzYjIpKTsKLQotCQlzYjIuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNiLCBzYjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNiLmhhc2hDb2RlKCkpOwotCi0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnNiLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPiAxNTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxUcnVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbFRydWUoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIHRydWUgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsVHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRTZXRUcnVlQ29tbWFuZCgpLCB0aGlzLnNiLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFVudGlsVHJ1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc2IsIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldEZhbHNlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBmYWxzZSBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpID4gMTUwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0RmFsc2VUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIHRydWUgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0RmFsc2UobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRGYWxzZSgpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSwgdGhpcy5zYiwgMjAwKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zYiwgMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgewotCQkJCXN5bmNCb29sLnNldFRydWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzeW5jQm9vbC53YWl0VW50aWxUcnVlKHRpbWVvdXQpKTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRGYWxzZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQoICEgc3luY0Jvb2wud2FpdFRvU2V0RmFsc2UodGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQkJfQotCQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY0Jvb2wpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRFeENhdWdodCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBzZXRFeENhdWdodChib29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXRoaXMuZXhDYXVnaHQgPSBleENhdWdodDsKLQl9Ci0KLQl2b2lkIHNldFRpbWVvdXRPY2N1cnJlZChib29sZWFuIHRpbWVvdXRPY2N1cnJlZCkgewotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRpbWVvdXRPY2N1cnJlZDsKLQl9Ci0KLQl2b2lkIHNldFN0YXJ0VGltZShsb25nIHN0YXJ0VGltZSkgewotCQl0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKLQl9Ci0KLQl2b2lkIHNldEVuZFRpbWUobG9uZyBlbmRUaW1lKSB7Ci0JCXRoaXMuZW5kVGltZSA9IGVuZFRpbWU7Ci0JfQotCi0JbG9uZyBlbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYTJkMzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkSW50OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJbnRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZEludCBzaTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZXhDYXVnaHQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBpbnQgdmFsdWUgPSA3OwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc0ludFZhbHVlOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkSW50VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zaSA9IG5ldyBTeW5jaHJvbml6ZWRJbnQoKTsKLQkJdGhpcy5leENhdWdodCA9IGZhbHNlOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc0ludFZhbHVlID0gMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmVxdWFscygwKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5lcXVhbHMoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RFcXVhbHNJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLm5vdEVxdWFscyg3KSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5ub3RFcXVhbHMoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1plcm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzWmVybygpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc1plcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90WmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oMSkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oNykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuT3JFcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgxKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoNykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuKDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW4oMSkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW4oOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuT3JFcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCgxKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzUG9zaXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc1Bvc2l0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc1Bvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFBvc2l0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90UG9zaXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RQb3NpdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOZWdhdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtMyk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdE5lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3ROZWdhdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtMyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3ROZWdhdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCi0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzWmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmFicygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmFicygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLXRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5hYnMoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kubmVnKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKC10aGlzLnZhbHVlLCB0aGlzLnNpLm5lZygpKTsKLQkJYXNzZXJ0RXF1YWxzKC10aGlzLnZhbHVlLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC10aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kubmVnKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0WmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFplcm8oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleFRoaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0U2FtZSh0aGlzLnNpLCB0aGlzLnNpLmdldE11dGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgwKTsKLQkJU3luY2hyb25pemVkSW50IHNvMiA9IG5ldyBTeW5jaHJvbml6ZWRJbnQoMCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNpLCBzbzIpOwotCi0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuZXF1YWxzKHNvMikpOwotCi0JCXNvMi5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2ksIHNvMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5oYXNoQ29kZSgpKTsKLQotCQl0aGlzLnNpLnNldFZhbHVlKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5oYXNoQ29kZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFVudGlsWmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbFplcm8oMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIDAgYnkgdDIKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5lbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gMTUwKTogIiArIHRpbWUsIHRpbWUgPiAxNTApOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byAwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFplcm9UaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybygyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gMCBieSB0MQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8IDE1MCk6ICIgKyB0aW1lLCB0aW1lIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsWmVybyhsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFplcm9Db21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxaZXJvQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIDA7Ci0JICogdGhlbiB0MiB3aWxsIHNldCB0aGUgdmFsdWUgdG8gNwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBhbiBvYmplY3QgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAxNTApOiAiICsgdGltZSwgdGltZSA+IDE1MCk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIG51bGwgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzWmVybygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8IDE1MCk6ICIgKyB0aW1lLCB0aW1lIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0VmFsdWUobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXRaZXJvQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCB1bnRpbCB0MSBpcyBmaW5pc2hlZCAiaW5pdGlhbGl6aW5nIiB0aGUgdmFsdWU7Ci0JICogdGhlbiB0MiB3aWxsIGdldCB0aGUgbmV3bHktaW5pdGlhbGl6ZWQgdmFsdWUgKDQyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoMCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCksIHRoaXMuc2ksIDApOwotCQkvLyBnaXZlIHQxIGEgaGVhZCBzdGFydCBvZiAxMDAgbXMKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEdldFZhbHVlQ29tbWFuZCgpLCB0aGlzLnNpLCAxMDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCQlhc3NlcnRFcXVhbHMoNDIsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0MiwgdGhpcy5zSW50VmFsdWUpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuZWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+IDEwMCk6ICIgKyB0aW1lLCB0aW1lID4gMzAwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodDFDb21tYW5kLCB0aGlzLnNpLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MkNvbW1hbmQsIHRoaXMuc2ksIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFNldFplcm9Db21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB7Ci0JCQkJc0ludC5zZXRaZXJvKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFVudGlsWmVyb0NvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzSW50LndhaXRVbnRpbFplcm8odGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQoICEgc0ludC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KSk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlzSW50LmV4ZWN1dGUoCi0JCQkJCW5ldyBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kKCkgewotCQkJCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJCQkvLyBwcmV0ZW5kIHRvIHBlcmZvcm0gc29tZSBsb25nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zZXRFeENhdWdodCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc0ludC5zZXRWYWx1ZSg0Mik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEdldFZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc2V0U09WYWx1ZShzSW50LmdldFZhbHVlKCkpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkSW50IHNJbnQsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQkJfQotCQkJCQljb21tYW5kLmV4ZWN1dGUoc0ludCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc2V0RXhDYXVnaHQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgc2V0RXhDYXVnaHQoYm9vbGVhbiBleENhdWdodCkgewotCQl0aGlzLmV4Q2F1Z2h0ID0gZXhDYXVnaHQ7Ci0JfQotCi0Jdm9pZCBzZXRUaW1lb3V0T2NjdXJyZWQoYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQpIHsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSB0aW1lb3V0T2NjdXJyZWQ7Ci0JfQotCi0Jdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWUpIHsKLQkJdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0JfQotCi0Jdm9pZCBzZXRFbmRUaW1lKGxvbmcgZW5kVGltZSkgewotCQl0aGlzLmVuZFRpbWUgPSBlbmRUaW1lOwotCX0KLQotCXByaXZhdGUgbG9uZyBlbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCXZvaWQgc2V0U09WYWx1ZShpbnQgc0ludFZhbHVlKSB7Ci0JCXRoaXMuc0ludFZhbHVlID0gc0ludFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgRXhjZXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzc3MzBlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZE9iamVjdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkT2JqZWN0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbzsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZXhDYXVnaHQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIE9iamVjdCBzb1ZhbHVlOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zbyA9IG5ldyBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PigpOwotCQl0aGlzLmV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5zb1ZhbHVlID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQl0aGlzLnNvLnNldE51bGwoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQlhc3NlcnRTYW1lKHRoaXMuc28sIHRoaXMuc28uZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbzIgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4obnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNvLCBzbzIpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uZXF1YWxzKHNvMikpOwotCi0JCXNvMi5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc28sIHNvMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQl0aGlzLnNvLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZS5oYXNoQ29kZSgpLCB0aGlzLnNvLmhhc2hDb2RlKCkpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNvLmhhc2hDb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsTnVsbCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gbnVsbCBieSB0MgotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5lbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gMTUwKTogIiArIHRpbWUsIHRpbWUgPiAxNTApOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbE51bGxUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsTnVsbCgyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gbnVsbCBieSB0MQotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5lbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBsYXRlIChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPCAxNTApOiAiICsgdGltZSwgdGltZSA8IDE1MCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRVbnRpbE51bGwobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXROdWxsQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFVudGlsTnVsbENvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBudWxsOwotCSAqIHRoZW4gdDIgd2lsbCBzZXQgdGhlIHZhbHVlIHRvIGFuIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBhbiBvYmplY3QgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAxNTApOiAiICsgdGltZSwgdGltZSA+IDE1MCk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIG51bGwgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8IDE1MCk6ICIgKyB0aW1lLCB0aW1lIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0VmFsdWUobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXROdWxsQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCB1bnRpbCB0MSBpcyBmaW5pc2hlZCAiaW5pdGlhbGl6aW5nIiB0aGUgdmFsdWU7Ci0JICogdGhlbiB0MiB3aWxsIGdldCB0aGUgbmV3bHktaW5pdGlhbGl6ZWQgdmFsdWUgKCJmb28iKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCksIHRoaXMuc28sIDApOwotCQkvLyBnaXZlIHQxIGEgaGVhZCBzdGFydCBvZiAxMDAgbXMKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEdldFZhbHVlQ29tbWFuZCgpLCB0aGlzLnNvLCAxMDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zb1ZhbHVlKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAxMDApOiAiICsgdGltZSwgdGltZSA+IDMwMCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQxQ29tbWFuZCwgdGhpcy5zbywgMjAwKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodDJDb21tYW5kLCB0aGlzLnNvLCAwKTsKLQkJVGhyZWFkIHQxID0gbmV3IFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXROdWxsQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB7Ci0JCQkJc09iamVjdC5zZXROdWxsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFVudGlsTnVsbENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0VGltZW91dE9jY3VycmVkKCAhIHNPYmplY3Qud2FpdFVudGlsTnVsbCh0aW1lb3V0KSk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0VGltZW91dE9jY3VycmVkKCAhIHNPYmplY3Qud2FpdFRvU2V0VmFsdWUoU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy52YWx1ZSwgdGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkSW5pdGlhbGl6ZVZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlzT2JqZWN0LmV4ZWN1dGUoCi0JCQkJCW5ldyBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kKCkgewotCQkJCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJCQkvLyBwcmV0ZW5kIHRvIHBlcmZvcm0gc29tZSBsb25nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRFeENhdWdodCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc09iamVjdC5zZXRWYWx1ZSgiZm9vIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEdldFZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRTT1ZhbHVlKHNPYmplY3QuZ2V0VmFsdWUoKSk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgQ29tbWFuZCBjb21tYW5kLCBmaW5hbCBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0LCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJCVRocmVhZC5zbGVlcChzbGVlcCk7Ci0JCQkJCX0KLQkJCQkJY29tbWFuZC5leGVjdXRlKHNPYmplY3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldEV4Q2F1Z2h0KHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHNldEV4Q2F1Z2h0KGJvb2xlYW4gZXhDYXVnaHQpIHsKLQkJdGhpcy5leENhdWdodCA9IGV4Q2F1Z2h0OwotCX0KLQotCXZvaWQgc2V0VGltZW91dE9jY3VycmVkKGJvb2xlYW4gdGltZW91dE9jY3VycmVkKSB7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gdGltZW91dE9jY3VycmVkOwotCX0KLQotCXZvaWQgc2V0U3RhcnRUaW1lKGxvbmcgc3RhcnRUaW1lKSB7Ci0JCXRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOwotCX0KLQotCXZvaWQgc2V0RW5kVGltZShsb25nIGVuZFRpbWUpIHsKLQkJdGhpcy5lbmRUaW1lID0gZW5kVGltZTsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQl2b2lkIHNldFNPVmFsdWUoT2JqZWN0IHNvVmFsdWUpIHsKLQkJdGhpcy5zb1ZhbHVlID0gc29WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTI2MjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkUXVldWU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFF1ZXVlVGVzdHMgZXh0ZW5kcyBTaW1wbGVRdWV1ZVRlc3RzIHsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3E7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGV4Q2F1Z2h0OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIE9iamVjdCBkZXF1ZXVlZE9iamVjdDsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8xID0gbmV3IFN0cmluZygpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8yID0gbmV3IFN0cmluZygpOwotCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JUXVldWU8U3RyaW5nPiBidWlsZFF1ZXVlKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCS8vIHN5bmNocm9uaXplZCBxdWV1ZSBpcyBub3QgY2xvbmVhYmxlCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zcSA9IG5ldyBTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+KCk7Ci0JCXRoaXMuZXhDYXVnaHQgPSBmYWxzZTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLmRlcXVldWVkT2JqZWN0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGZpcnN0IHdpdGggYW4gdW5zeW5jaHJvbml6ZWQgcXVldWUsCi0JICogdGhlbiB3aXRoIGEgc3luY2hyb25pemVkIHF1ZXVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U2ltcGxlUXVldWU8U3RyaW5nPigpLCAiZmlyc3QiKTsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U3luY2hyb25pemVkUXVldWU8U3RyaW5nPigpLCAic2Vjb25kIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MoU2xvd1F1ZXVlPFN0cmluZz4gc2xvd1F1ZXVlLCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24gewotCQlzbG93UXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJc2xvd1F1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCi0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShzbG93UXVldWUpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCVRocmVhZC5zbGVlcCgyMDApOwotCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2xvd1F1ZXVlLmRlcXVldWUoKSk7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCWFzc2VydFRydWUoc2xvd1F1ZXVlLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFNsb3dRdWV1ZTxTdHJpbmc+IHNsb3dRdWV1ZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsb3dRdWV1ZS5zbG93RGVxdWV1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgU2xvd1F1ZXVlPEU+IGV4dGVuZHMgUXVldWU8RT4gewotCQlPYmplY3Qgc2xvd0RlcXVldWUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTaW1wbGVRdWV1ZTxFPiBleHRlbmRzIFNpbXBsZVF1ZXVlPEU+IGltcGxlbWVudHMgU2xvd1F1ZXVlPEU+IHsKLQkJU2xvd1NpbXBsZVF1ZXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IHNsb3dEZXF1ZXVlKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTeW5jaHJvbml6ZWRRdWV1ZTxFPiBleHRlbmRzIFN5bmNocm9uaXplZFF1ZXVlPEU+IGltcGxlbWVudHMgU2xvd1F1ZXVlPEU+IHsKLQkJU2xvd1N5bmNocm9uaXplZFF1ZXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzbG93RGVxdWV1ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmRlcXVldWUoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHdhaXRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9EZXF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRGVxdWV1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBzaG91bGQgaGF2ZSBiZWVuIGRlcXVldWVkIGJ5IHQyLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLmRlcXVldWVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIHRoZSBxdWV1ZSBzaG91bGQgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNxLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPiAxNTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9EZXF1ZXVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb0RlcXVldWUoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBxdWV1ZSB3YXMgbmV2ZXIgZGVxdWV1ZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLmRlcXVldWVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGl0IHN0aWxsIGhvbGRzIHRoZSBpdGVtCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnNxLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9EZXF1ZXVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRFbnF1ZXVlQ29tbWFuZCgpLCB0aGlzLnNxLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvRGVxdWV1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc3EsIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9FbnF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRW5xdWV1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHF1ZXVlIGdldHMgZGVxdWV1ZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuZGVxdWV1ZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBpcyBlbnF1ZXVlZCBvbiB0byB0aGUgcXVldWUgYnkgdDIKLQkJYXNzZXJ0RmFsc2UodGhpcy5zcS5pc0VtcHR5KCkpOwotCQlhc3NlcnRTYW1lKElURU1fMiwgdGhpcy5zcS5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpID4gMTUwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvRW5xdWV1ZVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9FbnF1ZXVlKDIwKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgaXMgZXZlbnR1YWxseSBkZXF1ZXVlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmJ1dCBub3RoaW5nIGlzIGVucXVldWVkIG9uIHRvIHRoZSBxdWV1ZSBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc3EuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuZWxhcHNlZFRpbWUoKSA8IDE1MCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb0VucXVldWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zcS5lbnF1ZXVlKElURU1fMSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGREZXF1ZXVlQ29tbWFuZCgpLCB0aGlzLnNxLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvRW5xdWV1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc3EsIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEVucXVldWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHsKLQkJCQlzeW5jaHJvbml6ZWRRdWV1ZS5lbnF1ZXVlKElURU1fMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvRGVxdWV1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnNldERlcXVldWVkT2JqZWN0KHN5bmNocm9uaXplZFF1ZXVlLndhaXRUb0RlcXVldWUodGltZW91dCkpOwotCQkJCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCh0cnVlKTsKLQkJCQl9Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZERlcXVldWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuc2V0RGVxdWV1ZWRPYmplY3Qoc3luY2hyb25pemVkUXVldWUuZGVxdWV1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9FbnF1ZXVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuc2V0VGltZW91dE9jY3VycmVkKCAhIHN5bmNocm9uaXplZFF1ZXVlLndhaXRUb0VucXVldWUoSVRFTV8yLCB0aW1lb3V0KSk7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQkJfQotCQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY2hyb25pemVkUXVldWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuc2V0RXhDYXVnaHQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgc2V0RXhDYXVnaHQoYm9vbGVhbiBleENhdWdodCkgewotCQl0aGlzLmV4Q2F1Z2h0ID0gZXhDYXVnaHQ7Ci0JfQotCi0Jdm9pZCBzZXRUaW1lb3V0T2NjdXJyZWQoYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQpIHsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSB0aW1lb3V0T2NjdXJyZWQ7Ci0JfQotCi0Jdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWUpIHsKLQkJdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0JfQotCi0Jdm9pZCBzZXRFbmRUaW1lKGxvbmcgZW5kVGltZSkgewotCQl0aGlzLmVuZFRpbWUgPSBlbmRUaW1lOwotCX0KLQotCXZvaWQgc2V0RGVxdWV1ZWRPYmplY3QoT2JqZWN0IGRlcXVldWVkT2JqZWN0KSB7Ci0JCXRoaXMuZGVxdWV1ZWRPYmplY3QgPSBkZXF1ZXVlZE9iamVjdDsKLQl9Ci0KLQlsb25nIGVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2tUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTg3YjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZFN0YWNrOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRTdGFja1Rlc3RzIGV4dGVuZHMgU2ltcGxlU3RhY2tUZXN0cyB7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHNzOwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBleENhdWdodDsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBPYmplY3QgcG9wcGVkT2JqZWN0OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzEgPSBuZXcgU3RyaW5nKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzIgPSBuZXcgU3RyaW5nKCk7Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2tUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdGFjazxTdHJpbmc+IGJ1aWxkU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJLy8gc3luY2hyb25pemVkIHN0YWNrIGlzIG5vdCBjbG9uZWFibGUKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNzID0gbmV3IFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4oKTsKLQkJdGhpcy5leENhdWdodCA9IGZhbHNlOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMucG9wcGVkT2JqZWN0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGZpcnN0IHdpdGggYW4gdW5zeW5jaHJvbml6ZWQgc3RhY2ssCi0JICogdGhlbiB3aXRoIGEgc3luY2hyb25pemVkIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U2ltcGxlU3RhY2s8U3RyaW5nPigpLCAic2Vjb25kIik7Ci0JCXRoaXMudmVyaWZ5Q29uY3VycmVudEFjY2VzcyhuZXcgU2xvd1N5bmNocm9uaXplZFN0YWNrPFN0cmluZz4oKSwgImZpcnN0Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MoU2xvd1N0YWNrPFN0cmluZz4gc2xvd1N0YWNrLCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24gewotCQlzbG93U3RhY2sucHVzaCgiZmlyc3QiKTsKLQkJc2xvd1N0YWNrLnB1c2goInNlY29uZCIpOwotCi0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShzbG93U3RhY2spKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCVRocmVhZC5zbGVlcCgyMDApOwotCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2xvd1N0YWNrLnBvcCgpKTsKLQkJdGhyZWFkLmpvaW4oKTsKLQkJYXNzZXJ0VHJ1ZShzbG93U3RhY2suaXNFbXB0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgU2xvd1N0YWNrPFN0cmluZz4gc2xvd1N0YWNrKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2xvd1N0YWNrLnNsb3dQb3AoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByaXZhdGUgaW50ZXJmYWNlIFNsb3dTdGFjazxFPiBleHRlbmRzIFN0YWNrPEU+IHsKLQkJT2JqZWN0IHNsb3dQb3AoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTaW1wbGVTdGFjazxFPiBleHRlbmRzIFNpbXBsZVN0YWNrPEU+IGltcGxlbWVudHMgU2xvd1N0YWNrPEU+IHsKLQkJU2xvd1NpbXBsZVN0YWNrKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IHNsb3dQb3AoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1MDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wb3AoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U3luY2hyb25pemVkU3RhY2s8RT4gZXh0ZW5kcyBTeW5jaHJvbml6ZWRTdGFjazxFPiBpbXBsZW1lbnRzIFNsb3dTdGFjazxFPiB7Ci0JCVNsb3dTeW5jaHJvbml6ZWRTdGFjaygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2xvd1BvcCgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnBvcCgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogd2FpdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1BvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1BvcCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBzaG91bGQgaGF2ZSBiZWVuIHBvcHBlZCBieSB0Mi4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIHNob3VsZCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuZWxhcHNlZFRpbWUoKSA+IDE1MCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1BvcFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9Qb3AoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayB3YXMgbmV2ZXIgcG9wcGVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgaXQgc3RpbGwgaG9sZHMgdGhlIGl0ZW0KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuc3MucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuZWxhcHNlZFRpbWUoKSA8IDE1MCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1BvcChsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkUHVzaENvbW1hbmQoKSwgdGhpcy5zcywgMjAwKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFdhaXRUb1BvcENvbW1hbmQodGltZW91dCksIHRoaXMuc3MsIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9QdXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUHVzaCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIGdldHMgcG9wcGVkIGJ5IHQxLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBhbiBpdGVtIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2sgYnkgdDIKLQkJYXNzZXJ0RmFsc2UodGhpcy5zcy5pc0VtcHR5KCkpOwotCQlhc3NlcnRTYW1lKElURU1fMiwgdGhpcy5zcy5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpID4gMTUwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUHVzaFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9QdXNoKDIwKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgaXMgZXZlbnR1YWxseSBwb3BwZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMucG9wcGVkT2JqZWN0KTsKLQkJLy8gLi4uYnV0IG5vdGhpbmcgaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjayBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuZWxhcHNlZFRpbWUoKSA8IDE1MCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1B1c2gobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zcy5wdXNoKElURU1fMSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRQb3BDb21tYW5kKCksIHRoaXMuc3MsIDIwMCk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9QdXNoQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcywgMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUHVzaENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgewotCQkJCXN5bmNocm9uaXplZFN0YWNrLnB1c2goSVRFTV8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9Qb3BDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCXRyeSB7Ci0JCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRQb3BwZWRPYmplY3Qoc3luY2hyb25pemVkU3RhY2sud2FpdFRvUG9wKHRpbWVvdXQpKTsKLQkJCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQb3BDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0UG9wcGVkT2JqZWN0KHN5bmNocm9uaXplZFN0YWNrLnBvcCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9QdXNoQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0VGltZW91dE9jY3VycmVkKCAhIHN5bmNocm9uaXplZFN0YWNrLndhaXRUb1B1c2goSVRFTV8yLCB0aW1lb3V0KSk7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2ssIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQkJfQotCQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY2hyb25pemVkU3RhY2spOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0RXhDYXVnaHQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgc2V0RXhDYXVnaHQoYm9vbGVhbiBleENhdWdodCkgewotCQl0aGlzLmV4Q2F1Z2h0ID0gZXhDYXVnaHQ7Ci0JfQotCi0Jdm9pZCBzZXRUaW1lb3V0T2NjdXJyZWQoYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQpIHsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSB0aW1lb3V0T2NjdXJyZWQ7Ci0JfQotCi0Jdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWUpIHsKLQkJdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0JfQotCi0Jdm9pZCBzZXRFbmRUaW1lKGxvbmcgZW5kVGltZSkgewotCQl0aGlzLmVuZFRpbWUgPSBlbmRUaW1lOwotCX0KLQotCXZvaWQgc2V0UG9wcGVkT2JqZWN0KE9iamVjdCBwb3BwZWRPYmplY3QpIHsKLQkJdGhpcy5wb3BwZWRPYmplY3QgPSBwb3BwZWRPYmplY3Q7Ci0JfQotCi0JbG9uZyBlbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rlc3RUb29scy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhNGQxYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rlc3RUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RGYWlsdXJlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotCi0vKioKLSAqIHZhcmlvdXMgdG9vbHMgdGhhdCBjYW4gYmUgdXNlZCBieSB0ZXN0IGNhc2VzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VG9vbHMgewotCi0JLyoqCi0JICogdGVzdCBhbiBvYmplY3QncyBpbXBsZW1lbnRhdGlvbiBvZiBTZXJpYWxpemFibGUgYnkgc2VyaWFsaXppbmcgdGhlCi0JICogc3BlY2lmaWVkIG9iamVjdCB0byBhIGJ5dGUgYXJyYXk7IHRoZW4gZGUtc2VyaWFsaXppbmcgdGhlIGJ5dGUgYXJyYXkgYW5kCi0JICogcmV0dXJuaW5nIHRoZSByZXN1bHRhbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBzZXJpYWxpemUoVCBvKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFPdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDIwMDApOwotCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYU91dFN0cmVhbSk7Ci0JCW91dFN0cmVhbS53cml0ZU9iamVjdChvKTsKLQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFJblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYU91dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFJblN0cmVhbSk7Ci0JCVQgbzIgPSByZWFkT2JqZWN0KGluU3RyZWFtKTsKLQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gbzI7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChPYmplY3RJbnB1dCBvYmplY3RJbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChUKSBvYmplY3RJbnB1dC5yZWFkT2JqZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogcmVkaXJlY3Qgc3RkIG91dCBhbmQgc3RkIGVyciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0JCXJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKG5ldyBQcmludFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiByZWRpcmVjdCBzdGQgb3V0IGFuZCBzdGQgZXJyIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKFByaW50U3RyZWFtIHByaW50U3RyZWFtKSB7Ci0JCVN5c3RlbS5zZXRPdXQocHJpbnRTdHJlYW0pOwotCQlTeXN0ZW0uc2V0RXJyKHByaW50U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgdGVzdCBhbmQgcmV0dXJuIGEgdGV4dCBvdXRwdXQgb2YgaXRzIHJlc3VsdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGVjdXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGVzdFJlc3VsdCByZXN1bHQgPSB0ZXN0Q2FzZS5ydW4oKTsKLQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJd3JpdGVyLnByaW50KHRlc3RDYXNlLmdldE5hbWUoKSk7Ci0JCXdyaXRlci5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkgewotCQkJd3JpdGVyLnByaW50bG4oIk9LIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVRlc3RGYWlsdXJlIGZhaWx1cmUgPSBudWxsOwotCQkJaWYgKHJlc3VsdC5mYWlsdXJlcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgcmVzdWx0LmZhaWx1cmVzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgcmVzdWx0LmVycm9ycygpLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQl9Ci0JCXdyaXRlci5wcmludCgiZWxhcHNlZCB0aW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIGVsYXBzZWQgPSBlbmQgLSBzdGFydDsKLQkJd3JpdGVyLnByaW50KGVsYXBzZWQgLyAxMDAwTCk7Ci0JCXdyaXRlci5wcmludGxuKCIgc2VjLiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBvdXQgYWxsIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHRlc3QgY2FzZSwgYWxsb3dpbmcKLQkgKiB0aGUgdmFyaW91cyB0ZXN0IGZpeHR1cmVzIHRvIGJlIGdhcmJhZ2UtY29sbGVjdGVkLiBUeXBpY2FsbHkgdGhpcyBpcwotCSAqIGNhbGxlZCBpbiB0aGUgI3RlYXJEb3duKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQlmb3IgKENsYXNzPD8+IGNsYXp6ID0gdGVzdENhc2UuZ2V0Q2xhc3MoKTsgY2xhenogIT0gVGVzdENhc2VfY2xhc3M7IGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlmb3IgKEZpZWxkIGZpZWxkIDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewotCQkJCS8vIGxlYXZlIHByaW1pdGl2ZXMgYWxvbmUgLSB0aGV5IGRvbid0IGdldCBnYXJiYWdlLWNvbGxlY3RlZCwgYW5kIHdlIGNhbid0IHNldCB0aGVtIHRvIG51bGwuLi4KLQkJCQlpZiAoZmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGxlYXZlIHN0YXRpYyBmaWVsZHMgYWxvbmUgKD8pCi0JCQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQlmaWVsZC5zZXQodGVzdENhc2UsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdENhc2U+IFRlc3RDYXNlX2NsYXNzID0gVGVzdENhc2UuY2xhc3M7Ci0KLQkvKioKLQkgKiBXb3JrYXJvdW5kIGZvciBhIEpVbml0IGJ1ZzogSlVuaXQgZG9lcyBub3QgY29uZmlndXJlIHRoZSB0ZXN0aW5nIFRocmVhZAotCSAqIHdpdGggYSBjb250ZXh0IGNsYXNzIGxvYWRlci4gVGhpcyBzaG91bGQgcHJvYmFibHkgaGFwcGVuIGluCi0JICogVGVzdFJ1bm5lci5kb1J1blRlc3QoVGVzdCksIGp1c3QgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aHJlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVwSlVuaXRUaHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0JCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFRlc3RUb29scy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwcmVzc2VkIGNvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBUZXN0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTA0YjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5YTUxTdHJpbmdFbmNvZGVyOwotCi1wdWJsaWMgY2xhc3MgWE1MU3RyaW5nRW5jb2RlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFhNTFN0cmluZ0VuY29kZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIj9mb28/IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCi0JCXMgPSAiP2ZvbyYxMjMiOwotCQlleHBlY3RlZCA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVWYWxpZEZpbGVOYW1lKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiMTIzZm9vMTIzIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVJbnZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICI/Zm9vPyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiJiN4M2Y7Zm9vJiN4MjY7MTIzIjsKLQkJZXhwZWN0ZWQgPSAiP2ZvbyYxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIjEyM2ZvbzQ1NiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vPyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiP2ZvbyYxMjMmJiYmJiY+Pj4+Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJvdW5kVHJpcChTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGVuY29kZXIuZW5jb2RlKHMpOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUoYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2UzKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiN4Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTQoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3gzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTUoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3g7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTYoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mQSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U3KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiNBIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTgoKSB7Ci0JCVN0cmluZyBzID0gImZvbyYjeFpaWlo7IjsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXMgPSBlbmNvZGVyLmRlY29kZShzKTsKLQkJCWZhaWwocyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkYTc3Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLmVudW1lcmF0aW9ucy5FbXB0eUVudW1lcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUVudW1lcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlFbnVtZXJhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNNb3JlRWxlbWVudHMoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0RWxlbWVudCgpIHsKLQkJZm9yIChFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0RWxlbWVudCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1YjM0OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnMuSXRlcmF0b3JFbnVtZXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNNb3JlRWxlbWVudHNVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvblVwY2FzdCgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRFbGVtZW50KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWZvciAoRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRW51bWVyYXRpb24odGhpcy5idWlsZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248T2JqZWN0PiBidWlsZEVudW1lcmF0aW9uVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVudW1lcmF0aW9uVXBjYXN0KHRoaXMuYnVpbGRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbihJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3JFbnVtZXJhdGlvbjxTdHJpbmc+KGl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPE9iamVjdD4gYnVpbGRFbnVtZXJhdGlvblVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3JFbnVtZXJhdGlvbjxPYmplY3Q+KGl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0pwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDE0YzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5RW51bWVyYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTBjZjc2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogdGhpcy5idWlsZEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIEludGVnZXIucGFyc2VJbnQoc3RyaW5nKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oLTEsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oOCwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCAtMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCA5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShzdGFydCwgbGVuZ3RoKTsKLQkJCWZhaWwoImJvZ3VzIGl0ZXJhYmxlOiAiICsgaXRlcmFibGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSh0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwNTdlOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ2hhaW5JdGVyYWJsZTsKLQotcHVibGljIGNsYXNzIENoYWluSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFZFQ1RPUl9ISUVSQVJDSFkgPSB7IFZlY3Rvci5jbGFzcywgQWJzdHJhY3RMaXN0LmNsYXNzLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotCi0JcHVibGljIENoYWluSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0TGluaygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKENsYXNzPD8+IGNsYXp6IDogdGhpcy5idWlsZEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZW2krK10sIGNsYXp6KTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q2xhc3M8Pz4+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2hhaW5JdGVyYWJsZShWZWN0b3IuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q2xhc3M8Pz4+IGJ1aWxkQ2hhaW5JdGVyYWJsZShDbGFzczw/PiBzdGFydExpbmspIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYWJsZTxDbGFzczw/Pj4oc3RhcnRMaW5rKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTg1N2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQxKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjMSwgIjQiKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigiMCIsIGMxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUNvbGxlY3Rpb248SXRlcmFibGU8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8SXRlcmFibGU8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQoYzEpOwotCQljb2xsZWN0aW9uLmFkZChjMik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oY29sbGVjdGlvbik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGMxLCBjMik7Ci0JCWFzc2VydE5vdE51bGwoY29tcG9zaXRlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlYWM3ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2YyZjg3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gInByZWZpeCI7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLmJ1aWxkSXRlcmFibGUoKSkgewotCQkJYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKFBSRUZJWCkpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJpbmdJdGVyYWJsZSh0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkRmlsdGVyaW5nSXRlcmFibGUoSXRlcmFibGU8U3RyaW5nPiBuZXN0ZWRJdGVyYWJsZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihuZXN0ZWRJdGVyYWJsZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKFBSRUZJWCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmFibGUoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKFBSRUZJWCArICIxIik7Ci0JCWMuYWRkKFBSRUZJWCArICIyIik7Ci0JCWMuYWRkKFBSRUZJWCArICIzIik7Ci0JCWMuYWRkKCI0Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI1Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI2Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI3Iik7Ci0JCWMuYWRkKCI4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR2VuZXJpY0l0ZXJhYmxlV3JhcHBlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9HZW5lcmljSXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwNmM5Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9HZW5lcmljSXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5HZW5lcmljSXRlcmFibGVXcmFwcGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSXRlcmFibGVXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgR2VuZXJpY0l0ZXJhYmxlV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiZm9vIik7Ci0JCWxpc3QuYWRkKCJiYXIiKTsKLQkJbGlzdC5hZGQoImJheiIpOwotCQlTdHJpbmcgY29uY2F0ID0gIiI7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0KSB7Ci0JCQljb25jYXQgKz0gczsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0KLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IG5ldyBHZW5lcmljSXRlcmFibGVXcmFwcGVyPE9iamVjdD4obGlzdCk7Ci0JCWNvbmNhdCA9ICIiOwotCQlmb3IgKE9iamVjdCBzIDogaXRlcmFibGUpIHsKLQkJCWNvbmNhdCArPSBzOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjRlMTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuR3JhcGhJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdyYXBoSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPEdyYXBoTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCXB1YmxpYyBHcmFwaEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWlnaGJvcnMoKSB7Ci0JCWZvciAoR3JhcGhOb2RlIGduIDogdGhpcy5idWlsZEdyYXBoSXRlcmFibGUoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgYnVpbGRHcmFwaFJvb3QoKSB7Ci0JCUdyYXBoTm9kZSBuY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJOb3J0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgdmFOb2RlID0gbmV3IEdyYXBoTm9kZSgiVmlyZ2luaWEiKTsKLQkJR3JhcGhOb2RlIHNjTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlNvdXRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSBnYU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJHZW9yZ2lhIik7Ci0JCUdyYXBoTm9kZSBmbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJGbG9yaWRhIik7Ci0JCUdyYXBoTm9kZSBhbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJBbGFiYW1hIik7Ci0JCUdyYXBoTm9kZSBtc05vZGUgPSBuZXcgR3JhcGhOb2RlKCJNaXNzaXNzaXBwaSIpOwotCQlHcmFwaE5vZGUgdG5Ob2RlID0gbmV3IEdyYXBoTm9kZSgiVGVubmVzc2VlIik7Ci0KLQkJbmNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIHNjTm9kZSwgZ2FOb2RlLCB0bk5vZGUgfSk7Ci0JCXZhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCB0bk5vZGUgfSk7Ci0JCXNjTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBnYU5vZGUgfSk7Ci0JCWdhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBzY05vZGUsIGZsTm9kZSwgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCWZsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlIH0pOwotCQlhbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSwgbXNOb2RlLCB0bk5vZGUgfSk7Ci0JCW1zTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCXRuTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBuY05vZGUsIGdhTm9kZSwgYWxOb2RlLCBtc05vZGUgfSk7Ci0KLQkJcmV0dXJuIG5jTm9kZTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgR3JhcGhOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248R3JhcGhOb2RlPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCQlwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJR3JhcGhJdGVyYWJsZVRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQl2b2lkIHNldE5laWdoYm9ycyhHcmFwaE5vZGVbXSBuZWlnaGJvcnMpIHsKLQkJCXRoaXMubmVpZ2hib3JzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmVpZ2hib3JzKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycygpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZWlnaGJvcnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJHcmFwaE5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0pwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTUyM2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFpbkl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSXRlcmFibGVXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR3JhcGhJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiNTk3MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBMaXZlQ2xvbmVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjAiKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIiKTsKLQkJYy5hZGQoIjMiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGMuc2l6ZSgpKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBpdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQkJYy5yZW1vdmUoIjMiKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNCwgaSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0KLQkJLy8gaXRlcmFibGUgc2hvdWxkIG5vdyByZXR1cm4gb25seSAzIHN0cmluZ3MgKHNpbmNlIGl0J3MgImxpdmUiKQotCQlpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGl0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KGNvbGxlY3Rpb24pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJY29sbGVjdGlvbi5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJT2JqZWN0IHJlbW92ZWQgPSAidGhyZWUiOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJLy8gImxpdmUiIGNsb25lIGl0ZXJhYmxlIHdpbGwgbm8gbG9uZ2VyIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgInRocmVlIikpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZlYmMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFJlYWRPbmx5SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkVmVjdG9yKCkpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzg3MzdlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJpbmcpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2luZ2xlRWxlbWVudCgpIHsKLQkJcmV0dXJuICJzaW5nbGUgZWxlbWVudCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MGQ5OTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMCIpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMiIpOwotCQljLmFkZCgiMyIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYy5zaXplKCkpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBpdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQkJYy5yZW1vdmUoIjMiKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNCwgaSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0KLQkJLy8gaXRlcmFibGUgc2hvdWxkIHN0aWxsIHJldHVybiBvbmx5IDQgc3RyaW5ncyAoc2luY2UgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2FzIGNsb25lZCkKLQkJaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBpdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JCWFzc2VydEVxdWFscyg0LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPFN0cmluZz4oY29sbGVjdGlvbikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQljb2xsZWN0aW9uLnJlbW92ZShjdXJyZW50KTsKLQkJCX0KLQkJfTsKLQotCQlPYmplY3QgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGl0ZXJhYmxlLCByZW1vdmVkKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCQkvLyAic3RhdGljIiBjbG9uZSBpdGVyYWJsZSB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGl0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJzaXgiKTsKLQkJYy5hZGQoInNldmVuIik7Ci0JCWMuYWRkKCJlaWdodCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjRjMzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYWJsZSh0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUoSXRlcmFibGU8U3RyaW5nPiBuZXN0ZWRJdGVyYWJsZSkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhYmxlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIyIik7Ci0JCWMuYWRkKCIzMzMiKTsKLQkJYy5hZGQoIjQ0NDQiKTsKLQkJYy5hZGQoIjU1NTU1Iik7Ci0JCWMuYWRkKCI2NjY2NjYiKTsKLQkJYy5hZGQoIjc3Nzc3NzciKTsKLQkJYy5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODhkYjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyZWVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248VHJlZU5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQotCXB1YmxpYyBUcmVlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFRyZWVOb2RlIHRuIDogdGhpcy5idWlsZFRyZWVJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJlZU5vZGUgYnVpbGRUcmVlKCkgewotCQlUcmVlTm9kZSByb290ID0gbmV3IFRyZWVOb2RlKCJyb290Iik7Ci0JCVRyZWVOb2RlIGNoaWxkMSA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMSIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQxLCAiZ3JhbmRjaGlsZCAxQSIpOwotCQlUcmVlTm9kZSBjaGlsZDIgPSBuZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDIiKTsKLQkJbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkEiKTsKLQkJVHJlZU5vZGUgZ3JhbmRjaGlsZDJCID0gbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkIiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIxIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkIsICJncmVhdC1ncmFuZGNoaWxkIDJCMiIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkMgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQyIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJDLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQzEiKTsKLQkJbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAzIik7Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYWJsZVRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTlkODhkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEFycmF5KCkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljcygpIHsKLQkJSW50ZWdlcltdIGludGVnZXJzID0gbmV3IEludGVnZXJbM107Ci0JCWludGVnZXJzWzBdID0gbmV3IEludGVnZXIoMCk7Ci0JCWludGVnZXJzWzFdID0gbmV3IEludGVnZXIoMSk7Ci0JCWludGVnZXJzWzJdID0gbmV3IEludGVnZXIoMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRHZW5lcmljSXRlcmF0b3IoaW50ZWdlcnMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaW50ZWdlcnMubGVuZ3RoLCBpKTsKLQl9Ci0KLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmFyZ3MoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRWYXJBcmdJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JSXRlcmF0b3I8TnVtYmVyPiBidWlsZFZhckFyZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDIpKTsKLQl9Ci0KLQl2b2lkIHRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKHN0YXJ0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmVhbSwgZXhDYXVnaHQpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4NWI2Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIEFycmF5SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpbnQgaSA9IHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBpLS0sIEludGVnZXIucGFyc2VJbnQoc3RyZWFtLnByZXZpb3VzKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uQWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCIzLjUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uU2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJ0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRWYXJBcmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMikpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTGlzdEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDZjZWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBWRUNUT1JfSElFUkFSQ0hZID0geyBWZWN0b3IuY2xhc3MsIEFic3RyYWN0TGlzdC5jbGFzcywgQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLCBPYmplY3QuY2xhc3MgfTsKLQotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoVkVDVE9SX0hJRVJBUkNIWS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgbGluayIsIFZFQ1RPUl9ISUVSQVJDSFlbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgbGluayIsIFZFQ1RPUl9ISUVSQVJDSFlbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlDbGFzczw/PiBqYXZhQ2xhc3MgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJamF2YUNsYXNzID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJamF2YUNsYXNzID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGphdmFDbGFzcywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpID09IEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGFpbkl0ZXJhdG9yKFZlY3Rvci5jbGFzcywgdGhpcy5idWlsZExpbmtlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKFZlY3Rvci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaywgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGxpbmtlcikgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8Q2xhc3M8Pz4+KHN0YXJ0TGluaywgbGlua2VyKTsKLQl9Ci0KLQlwcml2YXRlIENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PiBidWlsZExpbmtlcigpIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+KCkgewotCQkJcHVibGljIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZElubmVyQ2hhaW5JdGVyYXRvcihDbGFzczw/PiBzdGFydExpbmspIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFpbkl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxDbGFzczw/Pj4gaXRlcmF0b3IgPSBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oVmVjdG9yLmNsYXNzKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3M8Pz4gYyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgY2xhc3M6ICIgKyBjLmdldE5hbWUoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGY4Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDbG9uZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JQ29sbGVjdGlvbjxTdHJpbmc+IG9yaWdpbmFsQ29sbGVjdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBjb25jdXJyZW50UHJvYmxlbTsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBjb25jdXJyZW50Q29sbGVjdGlvbjsKLQotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEZWZhdWx0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxpbWluYXRvcigpIHsKLQkJQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4gZWxpbWluYXRvciA9IG5ldyBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgZWxlbWVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbENvbGxlY3Rpb24sIGVsaW1pbmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3ViY2xhc3MoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbENvbGxlY3Rpb24pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnJlbW92ZShjdXJyZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBjb25jdXJyZW50IGFjY2VzczogRmlyc3QgYnVpbGQgYSBjbG9uZSBpdGVyYXRvciBpbiBhIHNlcGFyYXRlIHRocmVhZAotCSAqIHRoYXQgaGFuZ3MgbW9tZW50YXJpbHkgZHVyaW5nIGl0cyBjb25zdHJ1Y3Rpb247IHRoZW4gbW9kaWZ5IHRoZSBzaGFyZWQKLQkgKiBjb2xsZWN0aW9uIGluIHRoaXMgdGhyZWFkLiBUaGlzIHdvdWxkIGNhdXNlIGEKLQkgKiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluIHRoZSBvdGhlciB0aHJlYWQgaWYgdGhlIGNsb25lIGl0ZXJhdG9yCi0JICogd2VyZSBub3Qgc3luY2hyb25pemVkIG9uIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNsb3dDb2xsZWN0aW9uPFN0cmluZz4gc2xvdyA9IG5ldyBTbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgY29sbGVjdGlvbiB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gc2xvdzsKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24gPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKHNsb3cpOwotCi0JCXRoaXMuY29uY3VycmVudFByb2JsZW0gPSBmYWxzZTsKLQkJdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQl3aGlsZSAoIXNsb3cuaGFzU3RhcnRlZENsb25lKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RhcnQgdGhlIGNsb25lLi4uCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQkvLyAuLi50aGVuIHNuZWFrIGluIGFuIGV4dHJhIGVsZW1lbnQKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uYWRkKCJzZXZlbnRlZW4iKTsKLQkJd2hpbGUgKHRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gZmluaXNoCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbmN1cnJlbnRQcm9ibGVtKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogdXNlIGEgY2xvbmUgaXRlcmF0b3IgdG8gbG9vcCBvdmVyIHRoZSAic2xvdyIgY29sbGVjdGlvbiBhbmQgY29weSBpdHMKLQkgKiBjb250ZW50cyB0byB0aGUgY29uY3VycmVudCBjb2xsZWN0aW9uCi0JICovCi0Jdm9pZCBsb29wV2l0aENsb25lSXRlcmF0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQl0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXRoaXMuY29uY3VycmVudFByb2JsZW0gPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPihjKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZEVtcHR5Q29sbGVjdGlvbigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZEVtcHR5Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb2xsZWN0aW9uICoqKioqKioqKioKLQlzdGF0aWMgY2xhc3MgU2xvd0NvbGxlY3Rpb248RT4gZXh0ZW5kcyBBcnJheUxpc3Q8RT4gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSA9IGZhbHNlOwotCi0JCXB1YmxpYyBTbG93Q29sbGVjdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQl0aGlzLnNldEhhc1N0YXJ0ZWRDbG9uZSh0cnVlKTsKLQkJCS8vIHRha2UgYSBsaXR0bGUgc25vb3plIGJlZm9yZSByZXR1cm5pbmcgdGhlIGFycmF5Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgc2V0SGFzU3RhcnRlZENsb25lKGJvb2xlYW4gaGFzU3RhcnRlZENsb25lKSB7Ci0JCQl0aGlzLmhhc1N0YXJ0ZWRDbG9uZSA9IGhhc1N0YXJ0ZWRDbG9uZTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSgpIHsKLQkJCXJldHVybiB0aGlzLmhhc1N0YXJ0ZWRDbG9uZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDY1MmYzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JTGlzdDxTdHJpbmc+IG9yaWdpbmFsTGlzdDsKLQotCXByaXZhdGUgYm9vbGVhbiBjb25jdXJyZW50UHJvYmxlbTsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBjb25jdXJyZW50TGlzdDsKLQotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3JpZ2luYWxMaXN0ID0gdGhpcy5idWlsZExpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBjbG9uZUxpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQl3aGlsZSAobmVzdGVkTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImJhciIpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgidGhyZWUgYW5kIGEgaGFsZiIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYW5vdGhlciB0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvck5leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dChuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCwgdGhpcy5idWlsZE11dGF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhdG9yUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXMobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPiBidWlsZE11dGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChpbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5zZXQoaW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc05leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dCh0aGlzLmJ1aWxkU3ViY2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YmNsYXNzUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXModGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTdWJjbGFzcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QuYWRkKGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBjdXJyZW50SW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShjdXJyZW50SW5kZXgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeU5leHQoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRBZnRlciA9ICJmaXZlIjsKLQkJU3RyaW5nIGFkZGVkID0gImZpdmUgYW5kIGEgaGFsZiI7Ci0JCVN0cmluZyByZXBsYWNlZCA9ICJzZXZlbiI7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9ICJhbm90aGVyIHNldmVuIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWRBZnRlcikpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKGFkZGVkQWZ0ZXIpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TW9kaWZ5UHJldmlvdXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRCZWZvcmUgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmb3VyIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQmVmb3JlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBpdGVyYXRvci5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhhZGRlZEJlZm9yZSkpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IodGhpcy5vcmlnaW5hbExpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUxpc3RJdGVyYXRvcihMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMub3JpZ2luYWxMaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkRW1wdHlMaXN0KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJvbmUiKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgidGhyZWUiKTsKLQkJbGlzdC5hZGQoImZvdXIiKTsKLQkJbGlzdC5hZGQoImZpdmUiKTsKLQkJbGlzdC5hZGQoInNpeCIpOwotCQlsaXN0LmFkZCgic2V2ZW4iKTsKLQkJbGlzdC5hZGQoImVpZ2h0Iik7Ci0JCWxpc3QuYWRkKCJuaW5lIik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZEVtcHR5TGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPiBzbG93ID0gbmV3IENsb25lSXRlcmF0b3JUZXN0cy5TbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgbGlzdCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8gdGhpcy5vcmlnaW5hbExpc3QgPSBzbG93OwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3Qoc2xvdyk7Ci0KLQkJdGhpcy5jb25jdXJyZW50UHJvYmxlbSA9IGZhbHNlOwotCQl0aGlzLmNvbmN1cnJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZSgpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCXdoaWxlICghc2xvdy5oYXNTdGFydGVkQ2xvbmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBzdGFydCB0aGUgY2xvbmUuLi4KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCS8vIC4uLnRoZW4gc25lYWsgaW4gYW4gZXh0cmEgZWxlbWVudAotCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoInNldmVudGVlbiIpOwotCQl3aGlsZSAodGhyZWFkLmlzQWxpdmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBmaW5pc2gKLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29uY3VycmVudFByb2JsZW0pOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUxpc3QoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29uY3VycmVudExpc3QpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpIHsKLQkJdHJ5IHsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGhpcy5jb25jdXJyZW50TGlzdC5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0aGlzLmNvbmN1cnJlbnRQcm9ibGVtID0gdHJ1ZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNjMWQ5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vdGhlcigpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vdGhlcjIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyMygpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcig4LCBzdHJlYW0pOwotCX0KLQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihpbnQgZXhwZWN0ZWQsIEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vdGhlcigpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vdGhlcjIoKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyMygpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcigxLCBzdHJlYW0pOwotCX0KLQotCXZvaWQgdmVyaWZ5QW5vdGhlcihpbnQgc3RhcnQsIEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpbmRleCA9IHN0YXJ0OwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKyksIHN0cmVhbS5uZXh0KCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+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+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGExMDRhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJc3VwZXIudGVzdFJlbW92ZSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCS8vIHBvc2l0aW9uIHRvIGVuZCBvZiBzdHJlYW0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0ucmVtb3ZlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgLSAyLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMSIpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSAtIDEsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJmaXJzdCBlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKGZpcnN0RWxlbWVudDMpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjY2NjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMy41Iik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gYWRkIHRvIHRoZSBpdGVyYXRvcgotCQkJCXN0cmVhbS5hZGQoInNvbWV0aGluZyBpbiAzIik7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLmFkZCgiZmluYWxlIik7Ci0JCWJvb2xlYW4gY2hlY2tGb3JGaW5hbGUgPSB0cnVlOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKGNoZWNrRm9yRmluYWxlKSB7Ci0JCQkJY2hlY2tGb3JGaW5hbGUgPSBmYWxzZTsKLQkJCQlhc3NlcnRFcXVhbHMoImFkZGVkIGVsZW1lbnQgZHJvcHBlZCIsICJmaW5hbGUiLCBwcmV2aW91cyk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5hZGQoIjIuNSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5hZGQoIm9sZCBzdGFydCBvZiAzIik7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLmFkZCgicHJlbHVkZSIpOwotCQlhc3NlcnRFcXVhbHMoImFkZGVkIGVsZW1lbnQgZHJvcHBlZCIsICJwcmVsdWRlIiwgc3RyZWFtLnByZXZpb3VzKCkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudHMgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSArIDMsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgInByZWx1ZGUiLCBsaXN0MS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICIyLjUiLCBsaXN0MS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICIzLjUiLCBsaXN0MS5nZXQoNSkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudHMgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSArIDMsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgInNvbWV0aGluZyBpbiAzIiwgbGlzdDMuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAib2xkIHN0YXJ0IG9mIDMiLCBsaXN0My5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJmaW5hbGUiLCBsaXN0My5nZXQobGlzdDMuc2l6ZSgpIC0gMSkpOwotCi0JCS8vIGFkZCB0byB0aGUgZnJvbnQKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQkvLyBhZGQgdG8gdGhlIG1pZGRsZQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0ubmV4dCgpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLm5leHQoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5wcmV2aW91cygpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQkvLyBhZGQgdG8gdGhlIGVuZAotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLmhhc05leHQoKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJLy8gcG9zaXRpb24gdG8gZW5kIG9mIHN0cmVhbQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5zZXQoIjMzM2EiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uc2V0KCJlbmQgb2YgMSIpOwotCQkJfQotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIyMiIpKSB7Ci0JCQkJc3RyZWFtLnNldCgiMjJhIik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnNldCgic3RhcnQgb2YgMyIpOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50KHMpIGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgIjIyYSIsIGxpc3QxLmdldCgxKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiMzMzYSIsIGxpc3QxLmdldCgyKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgImVuZCBvZiAxIiwgbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQocykgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDMiLCAic3RhcnQgb2YgMyIsIGxpc3QzLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoZmlyc3RFbGVtZW50MykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQlpLS07Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjc3Nzc3NzciKSkgewotCQkJCXN0cmVhbS5hZGQoIjcuNSIpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjY2NjY2NiIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCS8vIHJlbW92aW5nIGEgcHJldmlvdXMgZWxlbWVudCwgZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJzb3IKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjIyIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIxLjUiKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgMCwgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPFN0cmluZz4+KSBpdGVyYXRvcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTRjY2QwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYzY3MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKExpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24gKG5leHQpOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIChwcmV2aW91cyk6ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24gKHJlbW92ZSkiLCBleENhdWdodCk7Ci0JCXRyeSB7Ci0JCQlFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpLnNldChuZXcgT2JqZWN0KCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24gKHNldCkiLCBleENhdWdodCk7Ci0JCXRyeSB7Ci0JCQlFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpLmFkZChuZXcgT2JqZWN0KCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24gKGFkZCkiLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDM0Mjk1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEVudW1lcmF0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKEVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbkl0ZXJhdG9yPFN0cmluZz4oZW51bWVyYXRpb24pOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLmVsZW1lbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdChFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxPYmplY3Q+KGVudW1lcmF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3OTQwYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJwcmVmaXgiOwotCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQWNjZXB0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoUFJFRklYICsgIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQWNjZXB0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2VwdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2VwdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQWNjZXB0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWplY3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVqZWN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDIsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWplY3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlamVjdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRGYWxzZSgiYm9ndXMgcmVqZWN0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvdGhIYXNOZXh0KCkgewotCQkvLyBpZiBib3RoIGFjY2VwdCgpIGFuZCByZWplY3QoKSBhcmUgb3ZlcnJpZGRlbiwgYWNjZXB0KCkgaXMgdXNlZAotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQm90aEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9hZE5leHQoKSB7Ci0JCS8vIGxvYWROZXh0KCkgdXNlZCB0byBjYXVzZSBhIE5QRSB3aGVuIGV4ZWN1dGluZyBkdXJpbmcgdGhlCi0JCS8vIGNvbnN0cnVjdG9yIGJlY2F1c2UgdGhlICJvdXRlciIgY2xhc3MgaXMgbm90IGJvdW5kIHVudGlsIGNvbXBsZXRpb24KLQkJLy8gb2YgdGhlIGNvbnN0cnVjdG9yCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcjIoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgYSBmaWx0ZXJlZCBpdGVyYXRvciB3aXRoIGEgbmVzdGVkIGl0ZXJhdG9yIG9mIGEgc3ViLXR5cGUgKE51bWJlciB2cy4gSW50ZWdlcikKLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3MxKCkgewotCQlMaXN0PEludGVnZXI+IGludGVnZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotCQlpbnRlZ2Vycy5hZGQobmV3IEludGVnZXIoMCkpOwotCQlpbnRlZ2Vycy5hZGQobmV3IEludGVnZXIoMSkpOwotCQlpbnRlZ2Vycy5hZGQobmV3IEludGVnZXIoMikpOwotCQlpbnRlZ2Vycy5hZGQobmV3IEludGVnZXIoMykpOwotCQlJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxJbnRlZ2VyLCBOdW1iZXI+KGludGVnZXJzLml0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEludGVnZXIgbykgewotCQkJCXJldHVybiBvLmludFZhbHVlKCkgPiAxOwotCQkJfQotCQl9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoc3RyZWFtKSk7Ci0JfQotCi0JLy8gdGVzdCBhIGZpbHRlcmVkIGl0ZXJhdG9yIHdpdGggYSBuZXN0ZWQgaXRlcmF0b3Igb2YgYSBzdXBlci10eXBlIChJbnRlZ2VyIHZzLiBOdW1iZXIpCi0JLy8gaS5lLiB0cnVzdCB0aGF0IEZpbHRlciB3aWxsIG9ubHkgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBzdWItdHlwZSBvYmplY3RzCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzMigpIHsKLQkJTGlzdDxOdW1iZXI+IG51bWJlcnMgPSBuZXcgQXJyYXlMaXN0PE51bWJlcj4oKTsKLQkJbnVtYmVycy5hZGQobmV3IEludGVnZXIoMCkpOwotCQludW1iZXJzLmFkZChuZXcgTG9uZygxKSk7Ci0JCW51bWJlcnMuYWRkKG5ldyBJbnRlZ2VyKDIpKTsKLQkJbnVtYmVycy5hZGQobmV3IEZsb2F0KDMpKTsKLQkJSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE51bWJlciwgSW50ZWdlcj4obnVtYmVycy5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOdW1iZXIgbykgewotCQkJCXJldHVybiBvIGluc3RhbmNlb2YgSW50ZWdlcjsKLQkJCX0KLQkJfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHN0cmVhbSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRmlsdGVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJOZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEZpbHRlckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihuZXN0ZWRJdGVyYXRvciwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKFBSRUZJWCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIFBSRUZJWDsKLQl9Ci0KLQkvLyB0aGlzIGlubmVyIGl0ZXJhdG9yIHdpbGwgY2FsbCB0aGUgIm91dGVyIiBvYmplY3QKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IyKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChGaWx0ZXJpbmdJdGVyYXRvclRlc3RzLnRoaXMuZ2V0UHJlZml4KCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChQUkVGSVggKyAiMSIpOwotCQljLmFkZChQUkVGSVggKyAiMiIpOwotCQljLmFkZChQUkVGSVggKyAiMyIpOwotCQljLmFkZCgiNCIpOwotCQljLmFkZChQUkVGSVggKyAiNSIpOwotCQljLmFkZChQUkVGSVggKyAiNiIpOwotCQljLmFkZChQUkVGSVggKyAiNyIpOwotCQljLmFkZCgiOCIpOwotCQlyZXR1cm4gYy5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEFjY2VwdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpbHRlcmVkSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRBY2NlcHRGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCS8vIHRoaXMgaW5uZXIgaXRlcmF0b3Igd2lsbCBjYWxsIHRoZSAib3V0ZXIiIG9iamVjdAotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVySXRlcmF0b3IyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcjIodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEZpbHRlckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpbHRlcmVkSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRGaWx0ZXJGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEFjY2VwdEZpbHRlcihTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZywgU3RyaW5nPihwcmVmaXgpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlamVjdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpbHRlcmVkSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRSZWplY3RGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZFJlamVjdEZpbHRlcihTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZywgU3RyaW5nPihwcmVmaXgpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHJlamVjdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCQl9OwotCX0KLQotCS8vIHVzZSBhbm9ueW1vdXMgaW5uZXIgRmlsdGVyCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEZpbHRlckZpbHRlcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHByZWZpeCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQm90aEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpbHRlcmVkSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRCb3RoRmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRCb3RoRmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gcmVqZWN0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRGaWx0ZXJpbmdJdGVyYXRvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQkJCVN0cmluZyBzID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBzKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HZW5lcmljSXRlcmF0b3JXcmFwcGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWFmYjlmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5HZW5lcmljSXRlcmF0b3JXcmFwcGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSXRlcmF0b3JXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgR2VuZXJpY0l0ZXJhdG9yV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiZm9vIik7Ci0JCWxpc3QuYWRkKCJiYXIiKTsKLQkJbGlzdC5hZGQoImJheiIpOwotCQlTdHJpbmcgY29uY2F0ID0gIiI7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJY29uY2F0ICs9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJmb29iYXJiYXoiLCBjb25jYXQpOwotCi0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IgPSBuZXcgR2VuZXJpY0l0ZXJhdG9yV3JhcHBlcjxPYmplY3Q+KGxpc3QpOwotCQljb25jYXQgPSAiIjsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoImJhciIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbmNhdCArPSBuZXh0OwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmF6IiwgY29uY2F0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UobGlzdC5jb250YWlucygiYmFyIikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlN2ViZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHcmFwaEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxHcmFwaE5vZGU+KCk7Ci0KLQlwdWJsaWMgR3JhcGhJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQyKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOZXh0KEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQyKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOZXh0KEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZTEoKSB7Ci0JCXRoaXMudmVyaWZ5U2l6ZSh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUyKCkgewotCQl0aGlzLnZlcmlmeVNpemUodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaXplKEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGl0ZXJhdG9yU2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKGl0ZXJhdG9yKTsKLQkJaW50IGFjdHVhbFNpemUgPSB0aGlzLm5vZGVzLnNpemUoKTsKLQkJYXNzZXJ0VHJ1ZSgiVG9vIGZldyBpdGVtcyBpbiBpdGVyYXRvci4iLCBpdGVyYXRvclNpemUgPj0gYWN0dWFsU2l6ZSk7Ci0JCWFzc2VydFRydWUoIlRvbyBtYW55IGl0ZW1zIGluIGl0ZXJhdG9yLiIsIGl0ZXJhdG9yU2l6ZSA8PSBhY3R1YWxTaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEdyYXBoSXRlcmF0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCQlJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yID0gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpOwotCQkJR3JhcGhOb2RlIGduID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBncmFwaCBub2RlOiAiICsgZ24pOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIGdyYXBoIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlzdGVyUm9nZXJzCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSwgdGhpcy5idWlsZE1pc3RlclJvZ2VycygpKTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4gYnVpbGRNaXN0ZXJSb2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgZ3JhcGggaXRlcmF0b3Igd2l0aCBhbiBvdmVycmlkZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgYnVpbGRHcmFwaFJvb3QoKSB7Ci0JCUdyYXBoTm9kZSBuY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJOb3J0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgdmFOb2RlID0gbmV3IEdyYXBoTm9kZSgiVmlyZ2luaWEiKTsKLQkJR3JhcGhOb2RlIHNjTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlNvdXRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSBnYU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJHZW9yZ2lhIik7Ci0JCUdyYXBoTm9kZSBmbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJGbG9yaWRhIik7Ci0JCUdyYXBoTm9kZSBhbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJBbGFiYW1hIik7Ci0JCUdyYXBoTm9kZSBtc05vZGUgPSBuZXcgR3JhcGhOb2RlKCJNaXNzaXNzaXBwaSIpOwotCQlHcmFwaE5vZGUgdG5Ob2RlID0gbmV3IEdyYXBoTm9kZSgiVGVubmVzc2VlIik7Ci0KLQkJbmNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIHNjTm9kZSwgZ2FOb2RlLCB0bk5vZGUgfSk7Ci0JCXZhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCB0bk5vZGUgfSk7Ci0JCXNjTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBnYU5vZGUgfSk7Ci0JCWdhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBzY05vZGUsIGZsTm9kZSwgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCWZsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlIH0pOwotCQlhbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSwgbXNOb2RlLCB0bk5vZGUgfSk7Ci0JCW1zTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCXRuTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBuY05vZGUsIGdhTm9kZSwgYWxOb2RlLCBtc05vZGUgfSk7Ci0KLQkJcmV0dXJuIG5jTm9kZTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgR3JhcGhOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248R3JhcGhOb2RlPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCQlwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJR3JhcGhJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQl2b2lkIHNldE5laWdoYm9ycyhHcmFwaE5vZGVbXSBuZWlnaGJvcnMpIHsKLQkJCXRoaXMubmVpZ2hib3JzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmVpZ2hib3JzKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycygpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZWlnaGJvcnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJHcmFwaE5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmM2QwZDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYWluSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbG9uZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNJdGVyYXRvcldyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmFwaEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVla2FibGVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNlYTc2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInRocmVlIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm91ciIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZpdmUiLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlZWsoKSB7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJZm9yIChQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwZWVrID0gc3RyZWFtLnBlZWsoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIHByZW1hdHVyZWx5IGlkZW50aWNhbCIsIHBlZWsgIT0gbmV4dCk7Ci0JCQluZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIG5vdCBpZGVudGljYWwiLCBwZWVrID09IG5leHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlZWtVcGNhc3QoKSB7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJZm9yIChQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwZWVrID0gc3RyZWFtLnBlZWsoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIHByZW1hdHVyZWx5IGlkZW50aWNhbCIsIHBlZWsgIT0gbmV4dCk7Ci0JCQluZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIG5vdCBpZGVudGljYWwiLCBwZWVrID09IG5leHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBidWlsZFBlZWthYmxlSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwY2JmZTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb21wb3NpdGVJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlIYXNBbm90aGVyKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlBbm90aGVyKHN0cmVhbSk7Ci0JCWludCBpID0gODsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpLS0pLCBzdHJlYW0yLnByZXZpb3VzKCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCAwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJLy8gVE9ETwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oc3RyZWFtKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygiMzMzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0yLnNldCgianVuayIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlFbXB0eUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8U3RyaW5nPj4pIGl0ZXJhdG9ycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmllZE5lc3RlZEl0ZXJhdG9ycygpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig0MikpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoMTExKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig3NykpOwotCi0JCUxpc3Q8RmxvYXQ+IGZsb2F0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDQyLjQyZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCgyMi4yMmYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoMTExLjExMWYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoNzcuNzdmKSk7Ci0KLQkJTGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PigpOwotCQlsaXN0LmFkZChpbnRlZ2VyTGlzdCk7Ci0JCWxpc3QuYWRkKGZsb2F0TGlzdCk7Ci0JCUxpc3RJdGVyYXRvcjxOdW1iZXI+IGxpID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE51bWJlcj4obGlzdCk7Ci0JCXdoaWxlIChsaS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUobGkubmV4dCgpLmludFZhbHVlKCkgPiAwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNTFiNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPE9iamVjdD4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWExNTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzVXBjYXN0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4VXBjYXN0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJib2d1cyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCJib2d1cyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdChMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsLmFkZCgib25lIik7Ci0JCWwuYWRkKCJ0d28iKTsKLQkJbC5hZGQoInRocmVlIik7Ci0JCWwuYWRkKCJmb3VyIik7Ci0JCWwuYWRkKCJmaXZlIik7Ci0JCWwuYWRkKCJzaXgiKTsKLQkJbC5hZGQoInNldmVuIik7Ci0JCWwuYWRkKCJlaWdodCIpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2UyMjY5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDQ4YjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAxLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXRyeSB7Ci0JCQlzdHJlYW0uYWRkKCJmb28iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCi0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiZm9vIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUyN2IyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TeW5jaHJvbml6ZWRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhbiB1bnN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgY29ycnVwdCBvdXRwdXQ7Ci0JICogdGhyZWFkIDEgd2lsbCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICogYW5kIHRoZW4gc2xlZXAgZm9yIGEgYml0LCBhbGxvd2luZyB0aHJlYWQgMiB0byBzbmVhayBpbiBhbmQKLQkgKiByZWFkIHRoZSBzYW1lIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWROZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0KLQkJTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IE5leHRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlOZXh0VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDIgPSBuZXcgTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJc2xlZXAoMTAwKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gYm90aCB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIHNhbWUgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aHJlYWQxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRocmVhZDIubmV4dCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCB0aGF0IGEgc3luY2hyb25pemVkIGl0ZXJhdG9yIHdpbGwgcHJvZHVjZSB2YWxpZCBvdXRwdXQ7Ci0JICogdGhyZWFkIDEgd2lsbCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICogYW5kIHRoZW4gc2xlZXAgZm9yIGEgYml0LCBidXQgdGhyZWFkIDIgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZAotCSAqIHdhaXQgdG8gcmVhZCB0aGUgc2Vjb25kIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkTmV4dCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQotCQlOZXh0VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDEgPSBuZXcgTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCU5leHRUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMiA9IG5ldyBOZXh0VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQlzbGVlcCgxMDApOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgdGhyZWFkcyBzaG91bGQgaGF2ZSByZWFkIHRoZSBjb3JyZWN0IGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhdG9yIDotKQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRocmVhZDEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhyZWFkMi5uZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRIYXNOZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMSA9IG5ldyBOZXh0VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJSGFzTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQyID0gbmV3IEhhc05leHRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgbGFzdCBlbGVtZW50LAotCQkvLyBidXQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0oCi0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhyZWFkMS5uZXh0KTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHRocmVhZDIuaGFzTmV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMSA9IG5ldyBOZXh0VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJSGFzTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQyID0gbmV3IEhhc05leHRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgbGFzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhyZWFkMS5uZXh0KTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aHJlYWQyLmhhc05leHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IE5leHRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlSZW1vdmVUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMiA9IG5ldyBSZW1vdmVUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB3cm9uZyBlbGVtZW50IHdhcyByZW1vdmVkIDotKAotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRocmVhZDEubmV4dCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDEgPSBuZXcgTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVJlbW92ZVRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQyID0gbmV3IFJlbW92ZVRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJc2xlZXAoMTAwKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHdyb25nIGVsZW1lbnQgd2FzIHJlbW92ZWQgOi0oCi0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhyZWFkMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JVGVzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8qKgotCSAqIG5leHQgdGhyZWFkCi0JICovCi0JY2xhc3MgTmV4dFRlc3RUaHJlYWQ8RT4gZXh0ZW5kcyBUaHJlYWQgewotCQlmaW5hbCBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJRSBuZXh0OwotCi0JCU5leHRUZXN0VGhyZWFkKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBoYXMgbmV4dCB0aHJlYWQKLQkgKi8KLQljbGFzcyBIYXNOZXh0VGVzdFRocmVhZDxFPiBleHRlbmRzIFRocmVhZCB7Ci0JCWZpbmFsIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlib29sZWFuIGhhc05leHQ7Ci0KLQkJSGFzTmV4dFRlc3RUaHJlYWQoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNOZXh0ID0gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aHJlYWQKLQkgKi8KLQljbGFzcyBSZW1vdmVUZXN0VGhyZWFkPEU+IGV4dGVuZHMgVGhyZWFkIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQkJUmVtb3ZlVGVzdFRocmVhZChJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGl0ZXJhdG9yCi0JICovCi0JY2xhc3MgVGVzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlmaW5hbCBBcnJheUxpc3Q8RT4gbGlzdDsKLQkJaW50IG5leHRJbmRleDsKLQkJaW50IGxhc3RJbmRleCA9IC0xOwotCQlUaHJlYWQgc2xvd1RocmVhZDsKLQotCQlUZXN0SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCBhcnJheSk7Ci0JCQl0aGlzLm5leHRJbmRleCA9IDA7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICE9IHRoaXMubGlzdC5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJaWYgKHRoaXMuaGFzTmV4dCgpKSB7Ci0JCQkJRSBuZXh0ID0gdGhpcy5saXN0LmdldCh0aGlzLm5leHRJbmRleCk7Ci0JCQkJdGhpcy5zbGVlcCgpOwotCQkJCXRoaXMubGFzdEluZGV4ID0gdGhpcy5uZXh0SW5kZXgrKzsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0SW5kZXggPT0gLTEpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHRoaXMubGFzdEluZGV4KTsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA8IHRoaXMubmV4dEluZGV4KSB7ICAvLyBjaGVjayBuZWNlc3NhcnkgZm9yIExpc3RJdGVyYXRvcgotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQl9Ci0JCQl0aGlzLmxhc3RJbmRleCA9IC0xOwotCQl9Ci0KLQkJdm9pZCBzbGVlcCgpIHsKLQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCVN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuc2xlZXAoMjAwKTsKLQkJCX0KLQkJfQotCi0JfQotCi0Jc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChtaWxsaXMpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1ZjUzZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IFByZXZpb3VzVGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMiA9IG5ldyBQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJc2xlZXAoMTAwKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gYm90aCB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIHNhbWUgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aHJlYWQxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aHJlYWQyLnByZXZpb3VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMSA9IG5ldyBQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVByZXZpb3VzVGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDIgPSBuZXcgUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIGNvcnJlY3QgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhyZWFkMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhyZWFkMi5wcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkSGFzUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IFByZXZpb3VzVGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJSGFzUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMiA9IG5ldyBIYXNQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJc2xlZXAoMTAwKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBidXQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbW9yZSAicHJldmlvdXMiIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aHJlYWQxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHRocmVhZDIuaGFzUHJldmlvdXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRIYXNQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMSA9IG5ldyBQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCUhhc1ByZXZpb3VzVGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDIgPSBuZXcgSGFzUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYW5kIHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlcmUgYXJlIG5vIG1vcmUgInByZXZpb3VzIiBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhyZWFkMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhyZWFkMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkTmV4dEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCi0JCU5leHRUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMSA9IG5ldyBOZXh0VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJTmV4dEluZGV4VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDIgPSBuZXcgTmV4dEluZGV4VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQlzbGVlcCgxMDApOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIHN0aWxsIDAgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhyZWFkMS5uZXh0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRocmVhZDIubmV4dEluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkTmV4dEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0KLQkJTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IE5leHRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlOZXh0SW5kZXhUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMiA9IG5ldyBOZXh0SW5kZXhUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYW5kIHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlIG5leHQgaW5kZXggaXMgMSA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aHJlYWQxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhyZWFkMi5uZXh0SW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFByZXZpb3VzSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IFByZXZpb3VzVGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJUHJldmlvdXNJbmRleFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQyID0gbmV3IFByZXZpb3VzSW5kZXhUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYnV0IHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlIG5leHQgaW5kZXggaXMgc3RpbGwgMCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aHJlYWQxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRocmVhZDIucHJldmlvdXNJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFByZXZpb3VzSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDEgPSBuZXcgUHJldmlvdXNUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlQcmV2aW91c0luZGV4VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJc2xlZXAoMTAwKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyAtMSA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aHJlYWQxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aHJlYWQyLnByZXZpb3VzSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMSA9IG5ldyBOZXh0VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJU2V0VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDIgPSBuZXcgU2V0VGVzdFRocmVhZDxTdHJpbmc+KGl0ZXJhdG9yLCAieHh4Iik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJc2xlZXAoMTAwKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHdyb25nIGVsZW1lbnQgd2FzIHNldCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aHJlYWQxLm5leHQpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQxID0gbmV3IE5leHRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IpOwotCQlTZXRUZXN0VGhyZWFkPFN0cmluZz4gdGhyZWFkMiA9IG5ldyBTZXRUZXN0VGhyZWFkPFN0cmluZz4oaXRlcmF0b3IsICJ4eHgiKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQlzbGVlcCgxMDApOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgcmlnaHQgZWxlbWVudCB3YXMgc2V0IDotKQotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRocmVhZDEubmV4dCk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRGYWxzZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRBZGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDEgPSBuZXcgTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCUFkZFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQyID0gbmV3IEFkZFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBhdCB0aGUgd3JvbmcgaW5kZXggOi0oCi0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhyZWFkMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVyYXRvci5saXN0LmluZGV4T2YoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFRocmVhZDxTdHJpbmc+IHRocmVhZDEgPSBuZXcgTmV4dFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvcik7Ci0JCUFkZFRlc3RUaHJlYWQ8U3RyaW5nPiB0aHJlYWQyID0gbmV3IEFkZFRlc3RUaHJlYWQ8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXNsZWVwKDEwMCk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBhdCB0aGUgY29ycmVjdCBpbmRleCA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aHJlYWQxLm5leHQpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZEl0ZXJhdG9yLmxpc3QuaW5kZXhPZigieHh4IikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8U3RyaW5nPikgbmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogcHJldmlvdXMgdGhyZWFkCi0JICovCi0JY2xhc3MgUHJldmlvdXNUZXN0VGhyZWFkPEU+IGV4dGVuZHMgVGhyZWFkIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlFIHByZXZpb3VzOwotCi0JCVByZXZpb3VzVGVzdFRocmVhZChMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5wcmV2aW91cyA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogaGFzIHByZXZpb3VzIHRocmVhZAotCSAqLwotCWNsYXNzIEhhc1ByZXZpb3VzVGVzdFRocmVhZDxFPiBleHRlbmRzIFRocmVhZCB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJYm9vbGVhbiBoYXNQcmV2aW91czsKLQotCQlIYXNQcmV2aW91c1Rlc3RUaHJlYWQoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMuaGFzUHJldmlvdXMgPSB0aGlzLml0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIG5leHQgaW5kZXggdGhyZWFkCi0JICovCi0JY2xhc3MgTmV4dEluZGV4VGVzdFRocmVhZDxFPiBleHRlbmRzIFRocmVhZCB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJaW50IG5leHRJbmRleDsKLQotCQlOZXh0SW5kZXhUZXN0VGhyZWFkKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLm5leHRJbmRleCA9IHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHByZXZpb3VzIGluZGV4IHRocmVhZAotCSAqLwotCWNsYXNzIFByZXZpb3VzSW5kZXhUZXN0VGhyZWFkPEU+IGV4dGVuZHMgVGhyZWFkIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgcHJldmlvdXNJbmRleDsKLQotCQlQcmV2aW91c0luZGV4VGVzdFRocmVhZChMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5wcmV2aW91c0luZGV4ID0gdGhpcy5pdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCB0aHJlYWQKLQkgKi8KLQljbGFzcyBTZXRUZXN0VGhyZWFkPEU+IGV4dGVuZHMgVGhyZWFkIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkJU2V0VGVzdFRocmVhZChMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5pdGVyYXRvci5zZXQodGhpcy5lbGVtZW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogYWRkIHRocmVhZAotCSAqLwotCWNsYXNzIEFkZFRlc3RUaHJlYWQ8RT4gZXh0ZW5kcyBUaHJlYWQgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWZpbmFsIEUgZWxlbWVudDsKLQotCQlBZGRUZXN0VGhyZWFkKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBlbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGxpc3QgaXRlcmF0b3IKLQkgKi8KLQljbGFzcyBUZXN0TGlzdEl0ZXJhdG9yPEU+IGV4dGVuZHMgVGVzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+IHsKLQotCQlUZXN0TGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJCXN1cGVyKGFycmF5KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggIT0gMDsKLQkJfQotCi0JCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkJaWYgKHRoaXMuaGFzUHJldmlvdXMoKSkgewotCQkJCUUgcHJldmlvdXMgPSB0aGlzLmxpc3QuZ2V0KHRoaXMucHJldmlvdXNJbmRleCgpKTsKLQkJCQlzbGVlcCgpOwotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQkJdGhpcy5sYXN0SW5kZXggPSB0aGlzLm5leHRJbmRleDsKLQkJCQlyZXR1cm4gcHJldmlvdXM7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4IC0gMTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA9PSAtMSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubGlzdC5zZXQodGhpcy5sYXN0SW5kZXgsIGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQkJdGhpcy5saXN0LmFkZCh0aGlzLmxhc3RJbmRleCwgZSk7Ci0JCQl0aGlzLmxhc3RJbmRleCsrOwotCQkJdGhpcy5sYXN0SW5kZXggPSAtMTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZhN2ZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksICgoSW50ZWdlcikgc3RyZWFtLm5leHQoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25JdGVyYXRvcihjLml0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGludGVnZXI6ICIgKyBpbnRlZ2VyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODYzZTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gLTE7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IobC5saXN0SXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uQWRkKCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uU2V0KCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5zZXQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJSW50ZWdlciBpbnRlZ2VyID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGludGVnZXIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWludCBpID0gc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpOwotCQkJaWYgKGkgPT0gMykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5idWlsZEl0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIjEiKTsKLQkJbC5hZGQoIjIyIik7Ci0JCWwuYWRkKCIzMzMiKTsKLQkJbC5hZGQoIjQ0NDQiKTsKLQkJbC5hZGQoIjU1NTU1Iik7Ci0JCWwuYWRkKCI2NjY2NjYiKTsKLQkJbC5hZGQoIjc3Nzc3NzciKTsKLQkJbC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBpbnRlZ2VyOiAiICsgaW50ZWdlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjU4ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxUcmVlTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JcHVibGljIFRyZWVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmUoSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyBwYXJlbnROYW1lID0gImNoaWxkIDIiOwotCQlTdHJpbmcgY2hpbGROYW1lID0gImdyYW5kY2hpbGQgMkEiOwotCQlpbnQgc3RhcnRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlpbnQgZW5kU2l6ZSA9IHRoaXMuY2hpbGRyZW5TaXplKHBhcmVudE5hbWUpOwotCQlhc3NlcnRFcXVhbHMoc3RhcnRTaXplIC0gMSwgZW5kU2l6ZSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2hpbGRyZW5TaXplKFN0cmluZyBub2RlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlPiBzdHJlYW0gPSB0aGlzLm5vZGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlUcmVlTm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5TaXplKCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlkd2lmZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCksIHRoaXMuYnVpbGRNaWR3aWZlKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+IGJ1aWxkTWlkd2lmZSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgdHJlZSBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJlZUl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IgPSBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJVHJlZU5vZGUgdG4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHRyZWUgbm9kZTogIiArIHRuKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhNTFlMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdXBwb3J0VGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVE9fU1RSSU5HID0gInRoaXMgaXMgYSB0ZXN0IjsKLQotCUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXIoKTsKLQotCVN0YXRlQ2hhbmdlRXZlbnQgc3RhdGVDaGFuZ2VFdmVudDsKLQlib29sZWFuIHN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCi0JUHJvcGVydHlDaGFuZ2VFdmVudCBwcm9wZXJ0eUNoYW5nZUV2ZW50OwotCWJvb2xlYW4gcHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydHlOYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IE9MRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBORVdfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9MRF9JTlRfVkFMVUUgPSBuZXcgSW50ZWdlcigyNyk7Ci0Jc3RhdGljIGZpbmFsIEJvb2xlYW4gT0xEX0JPT0xFQU5fVkFMVUUgPSBCb29sZWFuLlRSVUU7Ci0Jc3RhdGljIGZpbmFsIEludGVnZXIgTkVXX0lOVF9WQUxVRSA9IG5ldyBJbnRlZ2VyKDQyKTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBORVdfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlDb2xsZWN0aW9uRXZlbnQgY29sbGVjdGlvbkV2ZW50OwotCWJvb2xlYW4gaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9OQU1FID0gImNvbGxlY3Rpb25OYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRV8yID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIGludCBUQVJHRVRfSU5ERVggPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX0lOREVYID0gMjI7Ci0KLQlMaXN0RXZlbnQgbGlzdEV2ZW50OwotCWJvb2xlYW4gaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBpdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX05BTUUgPSAibGlzdE5hbWUiOwotCXN0YXRpYyBmaW5hbCBpbnQgQUREX0lOREVYID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0lOREVYID0gMjsKLQotCVRyZWVFdmVudCB0cmVlRXZlbnQ7Ci0JYm9vbGVhbiBub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIG5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiB0cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gdHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfTkFNRSA9ICJ0cmVlTmFtZSI7Ci0Jc3RhdGljIGZpbmFsIExpc3Q8T2JqZWN0PiBPQkpFQ1RfUEFUSCA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0KCksIG5ldyBPYmplY3QoKSwgbmV3IFN0cmluZygpfSk7Ci0KLQotCXB1YmxpYyBDaGFuZ2VTdXBwb3J0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU291cmNlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDaGFuZ2VTdXBwb3J0IGNzID0gbmV3IENoYW5nZVN1cHBvcnQobnVsbCk7Ci0JCQlmYWlsKCJib2d1cyBjaGFuZ2Ugc3VwcG9ydDogIiArIGNzKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQl0aGlzLnN0YXRlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVTdGF0ZUNoYW5nZSgpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3RhdGVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5zdGF0ZUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVyc0R1cGxpY2F0ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsU3RhdGVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNTdGF0ZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKG5ldyBBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihuZXcgU3RhdGVDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KG51bGwsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQobnVsbCwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfSU5UX1ZBTFVFLCBORVdfSU5UX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9JTlRfVkFMVUUsIE5FV19JTlRfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9CT09MRUFOX1ZBTFVFLCBORVdfQk9PTEVBTl9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0JPT0xFQU5fVkFMVUUsIE5FV19CT09MRUFOX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFByb3BlcnR5TGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnRlc3RNb2RlbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQUk9QRVJUWV9OQU1FLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk1peGVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQyKFJFTU9WRURfT0JKRUNUX1ZBTFVFLCAiZm9vIiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JLy8gY29sbGVjdGlvbiBjbGVhcmVkLi4uCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjEoKSk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRUcnVlKGNzbC5pdGVtc1JlbW92ZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNoYW5nZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRFcXVhbHMoMiwgY3NsLmFkZGVkSXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoY3NsLmFkZGVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImpvbyIsICJqYXIifSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY3NsLnJlbW92ZWRJdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjc2wucmVtb3ZlZEl0ZW1zLCBuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydEZhbHNlKGNzbC5pdGVtc0FkZGVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLml0ZW1zUmVtb3ZlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2hhbmdlZCk7Ci0JCWFzc2VydFRydWUoY3NsLmNvbGxlY3Rpb25DbGVhcmVkKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuYWRkZWRJdGVtcy5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGNzbC5yZW1vdmVkSXRlbXMuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMygpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjMoKSk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuaXRlbXNSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DaGFuZ2VkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DbGVhcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNzbC5hZGRlZEl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGNzbC5hZGRlZEl0ZW1zLCBuZXcgT2JqZWN0W10geyJqb28iLCAiamFyIiwgImJheiJ9KSk7Ci0JCWFzc2VydFRydWUoY3NsLnJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpOwotCX0KLQotCWNsYXNzIENvbGxlY3Rpb25TeW5jaExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCWJvb2xlYW4gaXRlbXNBZGRlZCA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1zUmVtb3ZlZCA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWQgPSB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJdGhpcy5pdGVtc0FkZGVkID0gdHJ1ZTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5hZGRlZEl0ZW1zLCBldmVudC5nZXRJdGVtcygpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWQgPSB0cnVlOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnJlbW92ZWRJdGVtcywgZXZlbnQuZ2V0SXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0NvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25FdmVudChPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmNvbGxlY3Rpb25FdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDT0xMRUNUSU9OX05BTUUsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Pz4gZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXMoKTsKLQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoT2JqZWN0Li4uIGl0ZW1zKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcy5sZW5ndGgsIHRoaXMuZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXNTaXplKCkpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXMoKSwgaXRlbSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXNTaXplKCkgewotCQlpZiAodGhpcy5jb2xsZWN0aW9uRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uQWRkRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5jb2xsZWN0aW9uRXZlbnQpLmdldEl0ZW1zU2l6ZSgpOwotCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDEsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgwLCAiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbUluTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlcGxhY2VJdGVtSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlcGxhY2VJdGVtSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlbXNJbkxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTZXRJdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoMSwgInh4eCIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTZXRJdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc0luTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCgyLCA0LCAyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdE1vdmVJdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoMiwgNCwgMik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbExpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNMaXN0TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0QWRkRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdJdGVtLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZEl0ZW0sICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0TW92ZUV2ZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0TW92ZUV2ZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YXJnZXRJbmRleCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2VJbmRleCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0U291cmNlSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhsZW5ndGgsICgoTGlzdE1vdmVFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENsZWFyRXZlbnQoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0Q2xlYXJFdmVudC5jbGFzcywgdGhpcy5saXN0RXZlbnQuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RDaGFuZ2VFdmVudC5jbGFzcywgdGhpcy5saXN0RXZlbnQuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkVHJlZSgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1RyZWVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVRyZWVFdmVudChMaXN0PD8+IHBhdGgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy50cmVlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFJFRV9OQU1FLCB0aGlzLnRyZWVFdmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgsIHRoaXMuZ2V0TGlzdFBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PD8+IGdldExpc3RQYXRoKCkgewotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IHRoaXMuZ2V0UGF0aCgpOwotCQlyZXR1cm4gKGl0ZXJhYmxlID09IG51bGwpICA/IG51bGwgOiBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRQYXRoKCkgewotCQlpZiAodGhpcy50cmVlRXZlbnQgaW5zdGFuY2VvZiBUcmVlQWRkRXZlbnQpIHsKLQkJCXJldHVybiAoKFRyZWVBZGRFdmVudCkgdGhpcy50cmVlRXZlbnQpLmdldFBhdGgoKTsKLQkJfQotCQlpZiAodGhpcy50cmVlRXZlbnQgaW5zdGFuY2VvZiBUcmVlUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKFRyZWVSZW1vdmVFdmVudCkgdGhpcy50cmVlRXZlbnQpLmdldFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCJmb28iKTsKLQkJYzEuYWRkKCJiYXIiKTsKLQkJYzEuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiZm9vIik7Ci0JCWMyLmFkZCgiYmFyIik7Ci0JCWMyLmFkZCgiYmF6Iik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEVsZW1lbnRzQXJlRXF1YWwoYzEsIGMyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCJmb28iKTsKLQkJYzEuYWRkKCJiYXIiKTsKLQkJYzEuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiYmF6Iik7Ci0JCWMyLmFkZCgiYmFyIik7Ci0JCWMyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50KGMxLCBjMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWwxKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbChudWxsLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWwzKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsNCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDUoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50NCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQ1KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDQoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkNSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKCJiYXIiLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDUoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxDbG9uZSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gdmVyaWZ5IHRoYXQgdGhlIGNsb25lIGRvZXMgbm90IGhhdmUgYW55IGxpc3RlbmVycwotCQlUZXN0TW9kZWwgY2xvbmUgPSB0aGlzLnRlc3RNb2RlbC5jbG9uZSgpOwotCQlhc3NlcnRGYWxzZShjbG9uZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCWNsb25lLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJLy8gY2hlY2sgb3JpZ2luYWwKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IG9yaWdpbmFsCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCS8vIG5vdyB0ZXN0IGV2ZW50cyBmaXJlZCBieSBjbG9uZQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCWNsb25lLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChjbG9uZSwgT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50b1N0cmluZygpLmNvbnRhaW5zKCcoJyArIFRFU1RfVE9fU1RSSU5HICsgJyknKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0KLQljbGFzcyBBZGFwdGVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5zdGF0ZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuc3RhdGVDaGFuZ2VFdmVudCA9IGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IGU7Ci0JCX0KLQkKLQkKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuY29sbGVjdGlvbkV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuY29sbGVjdGlvbkV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLm5vZGVBZGRlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy50cmVlRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy50cmVlRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvLyAqKioqKiBzdGF0ZQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQkvLyAqKioqKiBwcm9wZXJ0eQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBPTERfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX09CSkVDVF9WQUxVRSwgT0xEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfSU5UX1ZBTFVFLmludFZhbHVlKCksIE5FV19JTlRfVkFMVUUuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9JTlRfVkFMVUUuaW50VmFsdWUoKSwgT0xEX0lOVF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCksIE5FV19CT09MRUFOX1ZBTFVFLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJLy8gKioqKiogY29sbGVjdGlvbgotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKENPTExFQ1RJT05fTkFNRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oQURERURfT0JKRUNUX1ZBTFVFLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKEFEREVEX09CSkVDVF9WQUxVRSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbihBRERFRF9PQkpFQ1RfVkFMVUUpLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKEFEREVEX09CSkVDVF9WQUxVRSksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7QURERURfT0JKRUNUX1ZBTFVFLCBBRERFRF9PQkpFQ1RfVkFMVUVfMn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbigiZm9vIiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIiLCBSRU1PVkVEX09CSkVDVF9WQUxVRX0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJmb28iKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbigiZm9vIiksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIiLCBSRU1PVkVEX09CSkVDVF9WQUxVRX0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0Q2xlYXJDb2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiam9vIik7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiamFyIik7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24zKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqb28iKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqYXIiKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvLyAqKioqKiBsaXN0Ci0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLCBMSVNUX05BTUUsIEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLCBMSVNUX05BTUUsIEFERF9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFEREVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX05BTUUsIEFERF9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBRERFRF9PQkpFQ1RfVkFMVUUpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYLCAxKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQobmV3IExpc3RNb3ZlRXZlbnQodGhpcywgTElTVF9OQU1FLCBTT1VSQ0VfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9OQU1FLCBUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkKExJU1RfTkFNRSwgU09VUkNFX0lOREVYLCBTT1VSQ0VfSU5ERVgsIDEpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbU1vdmVkKExJU1RfTkFNRSwgVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQobmV3IExpc3RDbGVhckV2ZW50KHRoaXMsIExJU1RfTkFNRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDbGVhcmVkKExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX05BTUUsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KDIsICJqb28iLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KCJqb28iLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdCgyLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJqb28iKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdCgyLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0KCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiam9vIiksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3ROb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoMSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoImJhciIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4KCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCgxLCAxLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCgyLCAwLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImJhciIpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZXRhaW5JdGVtc0luTGlzdChuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0sIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZXBsYWNlSXRlbUluTGlzdCgiYmFyIiwgInh4eCIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5zZXRJdGVtc0luTGlzdCgxLCBuZXcgU3RyaW5nW10geyJ4eHgifSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJbGlzdC5hZGQoInh4eCIpOwotCQkJbGlzdC5hZGQoInl5eSIpOwotCQkJbGlzdC5hZGQoInp6eiIpOwotCQkJdGhpcy5tb3ZlSXRlbXNJbkxpc3QoMiwgNCwgMiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RDbGVhckxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5jbGVhckxpc3QobGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gb2xkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJb2xkTGlzdC5hZGQoImZvbyIpOwotCQkJb2xkTGlzdC5hZGQoImJhciIpOwotCQkJb2xkTGlzdC5hZGQoImJheiIpOwotCQkJb2xkTGlzdC5hZGQoInh4eCIpOwotCQkJb2xkTGlzdC5hZGQoInl5eSIpOwotCQkJb2xkTGlzdC5hZGQoInp6eiIpOwotCQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCW5ld0xpc3QuYWRkKCJmb28iKTsKLQkJCW5ld0xpc3QuYWRkKCJwcHAiKTsKLQkJCW5ld0xpc3QuYWRkKCJiYXoiKTsKLQkJCW5ld0xpc3QuYWRkKCJ4eHgiKTsKLQkJCW5ld0xpc3QuYWRkKCJxcXEiKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIG9sZExpc3QsIExJU1RfTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3TGlzdCwgb2xkTGlzdCk7Ci0JCX0KLQotCQkvLyAqKioqKiB0cmVlCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCkgewotCQkJdGhpcy5maXJlTm9kZUFkZGVkKG5ldyBUcmVlQWRkRXZlbnQodGhpcywgVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlKCkgewotCQkJdGhpcy5maXJlTm9kZUFkZGVkKFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpIHsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcywgVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWUoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChUUkVFX05BTUUsIE9CSkVDVF9QQVRIKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKG5ldyBUcmVlQ2xlYXJFdmVudCh0aGlzLCBUUkVFX05BTUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChUUkVFX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQkvLyAqKioqKiBtaXNjCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVGVzdE1vZGVsIGNsb25lKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFRlc3RNb2RlbCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5lbGVtZW50c0FyZURpZmZlcmVudChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0RWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZChURVNUX1RPX1NUUklORyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uIHRlc3QgKioqKioqKioqKgotCS8vVE9ETyAtIFRoaXMgdGVzdCBkb2Vzbid0IHBhc3MgaW4gdGhlIEVjbGlwc2UgYnVpbGQgZW52aXJvbm1lbnQgKExpbnV4KSBmb3Igc29tZSByZWFzb24KLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotLy8JCUxvY2FsTW9kZWwgbW9kZWwxID0gbmV3IExvY2FsTW9kZWwoKTsKLS8vCQlGb28gZm9vMSA9IG5ldyBGb28oKTsKLS8vCQlCYXIgYmFyMSA9IG5ldyBCYXIoKTsKLS8vCQlKb28gam9vMSA9IG5ldyBKb28oKTsKLS8vCQlKYXIgamFyMSA9IG5ldyBKYXIoKTsKLS8vCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihmb28xKTsKLS8vCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihiYXIxKTsKLS8vCQltb2RlbDEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGpvbzEpOwotLy8JCW1vZGVsMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoamFyMSk7Ci0vLwotLy8JCUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzMSA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMSwgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGxpc3RlbmVyczEubGVuZ3RoKTsKLS8vCQkvLyB0aGUgb3JkZXIgb2YgdGhlc2UgY291bGQgY2hhbmdlLi4uCi0vLwkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzMVswXS5nZXRDbGFzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQmFyLmNsYXNzLCBsaXN0ZW5lcnMxWzFdLmdldENsYXNzKCkpOwotLy8KLS8vCQlsaXN0ZW5lcnMxID0gdGhpcy5nZXRMaXN0ZW5lcnMobW9kZWwxLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotLy8JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lcnMxLmxlbmd0aCk7Ci0vLwkJLy8gdGhlIG9yZGVyIG9mIHRoZXNlIGNvdWxkIGNoYW5nZS4uLgotLy8JCWFzc2VydEVxdWFscyhKb28uY2xhc3MsIGxpc3RlbmVyczFbMF0uZ2V0Q2xhc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEphci5jbGFzcywgbGlzdGVuZXJzMVsxXS5nZXRDbGFzcygpKTsKLS8vCi0vLwkJTG9jYWxNb2RlbCBtb2RlbDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1vZGVsMSk7Ci0vLwotLy8JCUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzMiA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMiwgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3RlbmVyczIubGVuZ3RoKTsKLS8vCQlhc3NlcnRFcXVhbHMoRm9vLmNsYXNzLCBsaXN0ZW5lcnMyWzBdLmdldENsYXNzKCkpOwotLy8KLS8vCQlsaXN0ZW5lcnMyID0gdGhpcy5nZXRMaXN0ZW5lcnMobW9kZWwyLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotLy8JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnMyLmxlbmd0aCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEpvby5jbGFzcywgbGlzdGVuZXJzMlswXS5nZXRDbGFzcygpKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIENoYW5nZUxpc3RlbmVyW10gZ2V0TGlzdGVuZXJzKExvY2FsTW9kZWwgbW9kZWwsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgewotLy8JCUNoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydCA9IChDaGFuZ2VTdXBwb3J0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobW9kZWwsICJjaGFuZ2VTdXBwb3J0Iik7Ci0vLwkJcmV0dXJuIChDaGFuZ2VMaXN0ZW5lcltdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoY2hhbmdlU3VwcG9ydCwgImdldExpc3RlbmVycyIsIENsYXNzLmNsYXNzLCBsaXN0ZW5lckNsYXNzKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0vLwkJTG9jYWxNb2RlbCgpIHsKLS8vCQkJc3VwZXIoKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9vIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLS8vCQlGb28oKSB7Ci0vLwkJCXN1cGVyKCk7Ci0vLwkJfQotLy8JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0vLwkJCS8vIGRvIG5vdGhpbmcKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmFyIGltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0vLwkJQmFyKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotLy8JCQkvLyBkbyBub3RoaW5nCi0vLwkJfQotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIGNsYXNzIEpvbyBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLS8vLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFN0cmVhbUZpZWxkW10gc2VyaWFsUGVyc2lzdGVudEZpZWxkcyA9IHtuZXcgT2JqZWN0U3RyZWFtRmllbGQoImNoYW5nZVN1cHBvcnQiLCBDaGFuZ2VTdXBwb3J0LmNsYXNzKX07Ci0vLwkJSm9vKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXIgZXh0ZW5kcyBMaXN0Q2hhbmdlQWRhcHRlciB7Ci0vLwkJSmFyKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBidWcoPykgdGVzdCAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNFX01FU1NBR0UgPSAidGhpcyBvYmplY3QgaXMgbm8gbG9uZ2VyIGxpc3RlbmluZyB0byBsb2NhbEEiOwotCi0JLyoqCi0JICogVGVzdCB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKLQkgKiAJLSBib3RoIEIgYW5kIEMgYXJlIGxpc3RlbmluZyB0byBBCi0JICogCS0gQyBpcyBhbHNvIGxpc3RlbmluZyB0byBCCi0JICogCS0gd2hlbiBCIHJlY2VpdmVzIGFuIGV2ZW50IGZyb20gQSwgaXQgd2lsbCBmaXJlIGFuIGV2ZW50IHRvIEMKLQkgKiAJLSB3aGVuIEMgcmVjZWl2ZXMgYW4gZXZlbnQgZnJvbSBCLCBpdCB3aWxsIFNUT1AgbGlzdGVuaW5nIHRvIEEKLQkgKiAJLSB0aGUgZXZlbnQgZnJvbSBCIHRvIEMgbWF5IGJlIHByZWNlZGVkIG9yIGZvbGxvd2VkIChkZXBlbmRpbmcgb24KLQkgKiAJCXRoZSBoYXNoIHBvc2l0aW9ucyBvZiBsaXN0ZW5lcnMpIGJ5IGFuIGV2ZW50IGZyb20gQSB0byBDOgotCSAqIAkJLSBpZiB0aGUgQSB0byBDIGV2ZW50IGNvbWVzIGZpcnN0LCBubyBwcm9ibGVtCi0JICogCQktIGJ1dCBpZiB0aGUgQSB0byBCIGV2ZW50IGNvbWVzIGZpcnN0LCB0aGUgQSB0byBDIGV2ZW50IHNob3VsZCBOT1QgaGFwcGVuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlU3RhdGVMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlQcm9wZXJ0eUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlDb2xsZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZUxpc3RMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeUxpc3RMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlVHJlZUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5VHJlZUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKE5vdGlmeUNvbW1hbmQgY29tbWFuZCkgewotCQlMb2NhbEEgbG9jYWxBID0gbmV3IExvY2FsQSgpOwotCQlMb2NhbEIgbG9jYWxCID0gbmV3IExvY2FsQihsb2NhbEEpOwotCi0JCS8vIGJ1aWxkIGEgYnVuY2ggb2YgTG9jYWxDcyBzbyBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBub3RpZmllZCBBRlRFUiB0aGUgTG9jYWxCOwotCQkvLyB1c2luZyAxMDAwIHNlZW1lZCB0byBmYWlsIHZlcnkgY29uc2lzdGVudGx5IGJlZm9yZSBDaGFuZ2VTdXBwb3J0IHdhcyBmaXhlZAotCQlMb2NhbENbXSBsb2NhbENzID0gbmV3IExvY2FsQ1sxMDAwXTsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ3MubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxvY2FsQ3NbaV0gPSBuZXcgTG9jYWxDKGxvY2FsQSwgbG9jYWxCKTsKLQkJfQotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQubm90aWZ5TGlzdGVuZXJzKGxvY2FsQSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKSA9PSBJU0VfTUVTU0FHRSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoZXhDYXVnaHQpOwotCi0JCWZvciAoaW50IGkgPSBsb2NhbENzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlhc3NlcnRGYWxzZShsb2NhbENzW2ldLmlzTGlzdGVuaW5nVG9Mb2NhbEEoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBOb3RpZnlDb21tYW5kIHsKLQkJdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgc2ltcGx5IGZpcmVzIGEgc3RhdGUgY2hhbmdlIGV2ZW50LiBCb3RoIExvY2FsQiBhbmQgTG9jYWxDCi0JICogd2lsbCBiZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxBIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUxvY2FsQSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXZvaWQgbm90aWZ5UHJvcGVydHlMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImZvbyIsIDEsIDIpOwotCQl9Ci0JCXZvaWQgbm90aWZ5Q29sbGVjdGlvbkxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCQl2b2lkIG5vdGlmeUxpc3RMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiZm9vIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0JCXZvaWQgbm90aWZ5VHJlZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgZmlyZSBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHdoZW5ldmVyIGl0IHJlY2VpdmVzCi0JICogYSBzdGF0ZSBjaGFuZ2UgZXZlbnQgZnJvbSBsb2NhbEEuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxCCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi0JewotCQlMb2NhbEIoTG9jYWxBIGxvY2FsQSkgewotCQkJc3VwZXIoKTsKLQkJCWxvY2FsQS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImJhciIsIDEsIDIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJiYXIiLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKCJiYXIiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9iamVjdCB3aWxsIGxpc3RlbiB0byB0d28gb3RoZXIgb2JqZWN0cywgbG9jYWxBIGFuZCBsb2NhbEIuCi0JICogSWYgdGhpcyBvYmplY3QgcmVjZWl2ZXMgbm90aWZpY2F0aW9uIGZyb20gbG9jYWxCLCBpdCB3aWxsIHN0b3AgbGlzdGVuaW5nIHRvCi0JICogbG9jYWxBLiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEEsIGl0IHdpbGwgY2hlY2sgdG8KLQkgKiBzZWUgd2hldGhlciBpdCBzdGlsbCBsaXN0ZW5pbmcgdG8gbG9jYWxBLiBJZiB0aGlzIG9iamVjdCBpcyBubyBsb25nZXIKLQkgKiBsaXN0ZW5pbmcgdG8gbG9jYWxBLCBpdCB3aWxsIGNvbXBsYWluIGFib3V0IHJlY2VpdmluZyB0aGUgZXZlbnQgYW5kCi0JICogdGhyb3cgYW4gZXhjZXB0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQwotCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBMb2NhbEEgbG9jYWxBOwotCQlwcml2YXRlIExvY2FsQiBsb2NhbEI7Ci0JCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5pbmdUb0xvY2FsQTsKLQotCQlMb2NhbEMoTG9jYWxBIGxvY2FsQSwgTG9jYWxCIGxvY2FsQikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubG9jYWxBID0gbG9jYWxBOwotCQkJdGhpcy5sb2NhbEIgPSBsb2NhbEI7Ci0KLQkJCWxvY2FsQS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSB0cnVlOwotCi0JCQlsb2NhbEIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYm9vbGVhbiBpc0xpc3RlbmluZ1RvTG9jYWxBKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQ2MzMwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyLkpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5zdWl0ZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhbmdlU3VwcG9ydFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5ld0V2ZW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL05ld0V2ZW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI3NjUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotLyoqCi0gKiB0ZXN0IHdoYXQgaXQgdGFrZXMgdG8gYWRkIGEgbmV3IHR5cGUgb2YgZXZlbnQgdG8KLSAqIG1vZGVsIGFuZCBjaGFuZ2Ugc3VwcG9ydAotICovCi1wdWJsaWMgY2xhc3MgTmV3RXZlbnRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEZvbyBmb287Ci0KLQlwdWJsaWMgTmV3RXZlbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgRm9vKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuZm9vLnJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQl0aGlzLmZvby5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmZvby5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUZvb0NoYW5nZUV2ZW50KCkgewotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXIucmVjZWl2ZWRGb29FdmVudCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5mb28uZm9vKCk7Ci0JCWFzc2VydFRydWUobGlzdGVuZXIucmVjZWl2ZWRGb29FdmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhhcm5lc3MgY2xhc3NlcyAqKioqKioqKioqCi0KLQljbGFzcyBGb28gZXh0ZW5kcyBBYnN0cmFjdEZvb01vZGVsIHsKLQkJRm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIGZvbygpIHsKLQkJCXRoaXMuZmlyZUZvb0NoYW5nZUV2ZW50KCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGltcGxlbWVudHMgRm9vQ2hhbmdlTGlzdGVuZXIgewotCQlib29sZWFuIHJlY2VpdmVkRm9vRXZlbnQgPSBmYWxzZTsKLQkJTG9jYWxMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZm9vQ2hhbmdlZChGb29DaGFuZ2VFdmVudCBldmVudCkgewotCQkJdGhpcy5yZWNlaXZlZEZvb0V2ZW50ID0gdHJ1ZTsKLQkJfQotCX0KLQotCWludGVyZmFjZSBGb29Nb2RlbCBleHRlbmRzIE1vZGVsIHsKLQkJdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCXZvaWQgcmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCX0KLQotCWludGVyZmFjZSBGb29DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIGZvb0NoYW5nZWQoRm9vQ2hhbmdlRXZlbnQgZXZlbnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBGb29DaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXB1YmxpYyBGb29DaGFuZ2VFdmVudChGb29Nb2RlbCBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQkJcHVibGljIEZvb0NoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQkJcmV0dXJuIG5ldyBGb29DaGFuZ2VFdmVudCgoRm9vTW9kZWwpIG5ld1NvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQWJzdHJhY3RGb29Nb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBGb29Nb2RlbCB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZvb0NoYW5nZVN1cHBvcnQgZ2V0Q2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiAoRm9vQ2hhbmdlU3VwcG9ydCkgc3VwZXIuZ2V0Q2hhbmdlU3VwcG9ydCgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IEZvb0NoYW5nZVN1cHBvcnQodGhpcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIGZpcmVGb29DaGFuZ2VFdmVudCgpIHsKLQkJCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVGb29DaGFuZ2VkKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuICEgdGhpcy5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBGb29DaGFuZ2VTdXBwb3J0IGV4dGVuZHMgQ2hhbmdlU3VwcG9ydCB7Ci0JCUZvb0NoYW5nZVN1cHBvcnQoRm9vTW9kZWwgc291cmNlKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQl9Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Rm9vQ2hhbmdlTGlzdGVuZXI+IEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBGb29DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQkJdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5hZGRMaXN0ZW5lcihGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JCX0KLQkJdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCQl9Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0PEZvb0NoYW5nZUxpc3RlbmVyPiBnZXRGb29DaGFuZ2VMaXN0ZW5lckxpc3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JCX0KLQkJcHJpdmF0ZSBJdGVyYWJsZTxGb29DaGFuZ2VMaXN0ZW5lcj4gZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJTGlzdGVuZXJMaXN0PEZvb0NoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldEZvb0NoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldEZvb0NoYW5nZUxpc3RlbmVycygpLCBsaXN0ZW5lcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmlyZUZvb0NoYW5nZWQoKSB7Ci0JCQlJdGVyYWJsZTxGb29DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRGb29DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUZvb0NoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJCQlmb3IgKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJCWlmICh0aGlzLmhhc0Zvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSkgewotCQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQkJZXZlbnQgPSBuZXcgRm9vQ2hhbmdlRXZlbnQoKEZvb01vZGVsKSB0aGlzLnNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlsaXN0ZW5lci5mb29DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzRlYzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgUHJvcGVydHlUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgQ29sbGVjdGlvblRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJiYXIiLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZExpc3RDaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQXNwZWN0KCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBMaXN0VGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVHJlZUNoYW5nZUxpc3RlbmVySW52YWxpZENsYXNzKCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBTdGF0ZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFRyZWVDaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFRyZWVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0IG1vZGVscyAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgU3RhdGVUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJU3RhdGVUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvcGVydHlUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJUHJvcGVydHlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIENvbGxlY3Rpb25UZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJQ29sbGVjdGlvblRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBMaXN0VGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUxpc3RUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVHJlZVRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlUcmVlVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFRyZWVDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRhOWI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmE3NTlkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50IiwgImNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50IiwgImNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIsICJpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgImNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAiY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQlNZXRob2QgbWV0aG9kID0gQ2xhc3NUb29scy5tZXRob2QodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCS8vIGJ1aWxkIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIExJU1QgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJjb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJib2d1cyBsaXN0IiwgKExpc3RDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VMaXN0KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19DT0xMRUNUSU9OID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVTdHJpbmcocyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQl2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGNoYW5nZUxpc3QoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiYm9ndXMgbGlzdCIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZTsKLQkJU3RyaW5nIHN0cmluZzsKLQkJYm9vbGVhbiBpdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIFN0cmluZyBzdHJpbmcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMuY29sbGVjdGlvbk5hbWUgPSBjb2xsZWN0aW9uTmFtZTsKLQkJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIG9iamVjdDogIiArIG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4Yjc2Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQiLCAiaXRlbU1vdmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIsICJpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50IiwgImxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gImZvbyI7Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSAiYmFyIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhvbGRTdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG5ld1N0cmluZywgMCwgb2xkU3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwubW92ZVN0cmluZygwLCAyKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlQWxsU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibGlzdENoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgImxpc3RDaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7TGlzdENoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQkvLyBidWlsZCBhIExJU1QgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibGlzdEV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYm9ndXMgY29sbGVjdGlvbiIsIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlQ29sbGVjdGlvbigpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1NfTElTVCA9ICJzdHJpbmdzIjsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHN0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgcmVtb3ZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cmluZyksIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlcGxhY2VTdHJpbmcoU3RyaW5nIG9sZFN0cmluZywgU3RyaW5nIG5ld1N0cmluZykgewotCQkJdGhpcy5zZXRJdGVtSW5MaXN0KHRoaXMuc3RyaW5ncy5pbmRleE9mKG9sZFN0cmluZyksIG5ld1N0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgbW92ZVN0cmluZyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIGNsZWFyU3RyaW5ncygpIHsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlcGxhY2VBbGxTdHJpbmdzKFN0cmluZ1tdIG5ld1N0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncy5jbGVhcigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnN0cmluZ3MsIG5ld1N0cmluZ3MpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoU1RSSU5HU19MSVNULCB0aGlzLnN0cmluZ3MpOwotCQl9Ci0JCXZvaWQgY2hhbmdlQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJib2d1cyBjb2xsZWN0aW9uIiwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgbGlzdE5hbWU7Ci0JCVN0cmluZyBzdHJpbmc7Ci0JCWludCBpbmRleDsKLQkJU3RyaW5nIHJlcGxhY2VkU3RyaW5nOwotCQlpbnQgc291cmNlSW5kZXg7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdEV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotCQkJdGhpcy5zdHJpbmcgPSBzdHJpbmc7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBsaXN0TmFtZSwgU3RyaW5nIHN0cmluZywgaW50IGluZGV4LCBTdHJpbmcgcmVwbGFjZWRTdHJpbmcpIHsKLQkJCXRoaXModGVzdE1vZGVsLCBsaXN0TmFtZSwgc3RyaW5nLCBpbmRleCk7Ci0JCQl0aGlzLnJlcGxhY2VkU3RyaW5nID0gcmVwbGFjZWRTdHJpbmc7Ci0JCX0KLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQkJCXRoaXMuaW5kZXggPSB0YXJnZXRJbmRleDsKLQkJCXRoaXMuc291cmNlSW5kZXggPSBzb3VyY2VJbmRleDsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudChMaXN0QWRkRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0TmV3SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5yZXBsYWNlZFN0cmluZywgZS5nZXRPbGRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgaXRlbU1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50KExpc3RNb3ZlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldFRhcmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlSW5kZXgsIGUuZ2V0U291cmNlSW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBsaXN0Q2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQl9Ci0JCXZvaWQgbGlzdENsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50KExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBsaXN0Q2hhbmdlZERvdWJsZUFyZ3VtZW50KExpc3RDaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlICsgIiAtIG9iamVjdDogIiArIG8pOwotCQl9Ci0JCXZvaWQgbGlzdEV2ZW50U2luZ2xlQXJndW1lbnQoTGlzdEV2ZW50IGUpIHsKLQkJCXRoaXMubGlzdEV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDZlOGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb0FyZ3VtZW50TmFtZWRQcm9wZXJ0eSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnROYW1lZFByb3BlcnR5KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBtZXRob2QgdGhhdCBoYXMgbW9yZSBnZW5lcmFsIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudE5hbWVkUHJvcGVydHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlNZXRob2QgbWV0aG9kID0gQ2xhc3NUb29scy5tZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyIiwgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJLy8gYnVpbGQgYSBQUk9QRVJUWSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIFNUQVRFIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKChTdGF0ZUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge1Byb3BlcnR5Q2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgaW50IHZhbHVlID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQkJVGVzdE1vZGVsKGludCB2YWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCQl2b2lkIHNldFZhbHVlKGludCB2YWx1ZSkgewotCQkJaW50IG9sZCA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCQkJaWYgKG9sZCAhPSB2YWx1ZSkgewotCQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZTsKLQkJT2JqZWN0IG9sZFZhbHVlOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCWJvb2xlYW4gemVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG5ldyBJbnRlZ2VyKG9sZFZhbHVlKTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXcgSW50ZWdlcihuZXdWYWx1ZSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnR5TmFtZSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBvKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGUgPSAoUHJvcGVydHlDaGFuZ2VFdmVudCkgbzsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydHlOYW1lLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWREb3VibGVBcmd1bWVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDg5NjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQl0ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5jaGFuZ2VTdGF0ZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBtZXRob2QgdGhhdCBoYXMgbW9yZSBnZW5lcmFsIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQkvLyBidWlsZCBhIFNUQVRFIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgUFJPUEVSVFkgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoInZhbHVlIiwgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlUHJvcGVydHkoKTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgY2hhbmdlU3RhdGUoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQl2b2lkIGNoYW5nZVByb3BlcnR5KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKCJ2YWx1ZSIsIDU1LCA0Mik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlib29sZWFuIHplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBzaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCAoKFN0YXRlQ2hhbmdlRXZlbnQpIGUpLmdldFNvdXJjZSgpKTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50KFN0YXRlQ2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTgxYWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibm9kZUFkZGVkWmVyb0FyZ3VtZW50IiwgIm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRTaW5nbGVBcmd1bWVudCIsICJub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgInRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAidHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVOb2RlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJjaGlsZCIsICJncmFuZGNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiYW5vdGhlciBjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQkvLyBidWlsZCBhIFRSRUUgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAidHJlZUV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYm9ndXMgY29sbGVjdGlvbiIsIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlQ29sbGVjdGlvbigpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHJvb3Q7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBjaGlsZHJlbkxpc3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJlbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX1RSRUUgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbChTdHJpbmcgcm9vdCkgewotCQkJc3VwZXIoKTsKLQkJCWlmIChyb290ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KHJvb3QsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQocm9vdCwgbnVsbCk7Ci0JCX0KLQkJU3RyaW5nIGdldFJvb3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290OwotCQl9Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhdGgoU3RyaW5nIG5vZGUpIHsKLQkJCVN0cmluZyB0ZW1wID0gbm9kZTsKLQkJCUxpc3Q8U3RyaW5nPiByZXZlcnNlUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZG8gewotCQkJCXJldmVyc2VQYXRoLmFkZCh0ZW1wKTsKLQkJCQl0ZW1wID0gdGhpcy5wYXJlbnRzLmdldCh0ZW1wKTsKLQkJCX0gd2hpbGUgKHRlbXAgIT0gbnVsbCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UocmV2ZXJzZVBhdGgpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY2hpbGRyZW5MaXN0cy5rZXlTZXQoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVOb2RlKHMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdm9pZCBhZGROb2RlKFN0cmluZyBwYXJlbnQsIFN0cmluZyBjaGlsZCkgewotCQkJaWYgKChwYXJlbnQgPT0gbnVsbCkgfHwgKGNoaWxkID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGFkZCBhIGNoaWxkIHRvIGEgbm9uLWV4aXN0ZW50IHBhcmVudCIpOwotCQkJfQotCi0JCQlpZiAodGhpcy5jaGlsZHJlbkxpc3RzLmdldChjaGlsZCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBhZGQgYSBjaGlsZCB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUiKTsKLQkJCX0KLQkJCQotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQoY2hpbGQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoU1RSSU5HU19UUkVFLCB0aGlzLnBhdGgoY2hpbGQpKTsKLQkJfQotCQl2b2lkIHJlbW92ZU5vZGUoU3RyaW5nIG5vZGUpIHsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChub2RlKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJTGlzdDxTdHJpbmc+IHBhdGggPSB0aGlzLnBhdGgobm9kZSk7Ci0JCQlmb3IgKFN0cmluZyBzIDogY2hpbGRyZW4pIHsKLQkJCQl0aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnJlbW92ZShub2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFNUUklOR1NfVFJFRSwgcGF0aCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlTm9kZShTdHJpbmcgb2xkTm9kZSwgU3RyaW5nIG5ld05vZGUpIHsKLQkJCWlmICgob2xkTm9kZSA9PSBudWxsKSB8fCAobmV3Tm9kZSA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGQgbm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChuZXdOb2RlLCBjaGlsZHJlbik7Ci0JCQlmb3IgKFN0cmluZyBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgbmV3Tm9kZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwYXJlbnQgPSB0aGlzLnBhcmVudHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChuZXdOb2RlLCBwYXJlbnQpOwotCi0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChuZXdOb2RlKSk7Ci0JCX0KLQkJdm9pZCBjbGVhclRyZWUoKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMuY2xlYXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLmNsZWFyKCk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KHJvb3QsIG51bGwpOwotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQoU1RSSU5HU19UUkVFKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHRyZWVOYW1lOwotCQlMaXN0PFN0cmluZz4gcGF0aDsKLQkJYm9vbGVhbiBub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgdHJlZU5hbWUsIFN0cmluZ1tdIHBhdGgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQkJCXRoaXMucGF0aCA9IEFycmF5cy5hc0xpc3QocGF0aCk7Ci0JCX0KLQkJdm9pZCBub2RlQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbm9kZUFkZGVkU2luZ2xlQXJndW1lbnQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCXRoaXMubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgbm9kZVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgdHJlZUNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQl9Ci0JCXZvaWQgdHJlZUV2ZW50U2luZ2xlQXJndW1lbnQoVHJlZUV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjZjYjU1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRW1wbG95ZWUgZW1wbG95ZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZW1wbG95ZWVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBlbXBsb3llZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gaGlyZURhdGVBZGFwdGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgYWRhcHRlckV2ZW50OwotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIgdHJpZ2dlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVmZmVyZWRJREhvbGRlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWZmZXJlZE5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGJ1ZmZlcmVkSGlyZURhdGVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBidWZmZXJlZEV2ZW50OwotCi0JcHVibGljIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMuZW1wbG95ZWUgPSBuZXcgRW1wbG95ZWUoMTcsICJGcmVkZHkiLCBuZXcgRGF0ZSgpKTsKLQkJdGhpcy5lbXBsb3llZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KHRoaXMuZW1wbG95ZWUpOwotCi0JCXRoaXMudHJpZ2dlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIoKTsKLQotCQl0aGlzLmlkQWRhcHRlciA9IHRoaXMuYnVpbGRJREFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KHRoaXMuaWRBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5hbWVBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMuaGlyZURhdGVBZGFwdGVyID0gdGhpcy5idWlsZEhpcmVEYXRlQWRhcHRlcih0aGlzLmVtcGxveWVlSG9sZGVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4odGhpcy5oaXJlRGF0ZUFkYXB0ZXIsIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZElEQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIEludGVnZXI+KGVIb2xkZXIsIEVtcGxveWVlLklEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldElEKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihlSG9sZGVyLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBidWlsZEhpcmVEYXRlQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIERhdGU+KGVIb2xkZXIsIEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEhpcmVEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhEYXRlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEhpcmVEYXRlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlckFjY2VwdCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCi0JCWFzc2VydEVxdWFscygzMjMsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyaWdnZXJSZXNldCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhZGFwdGVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQWRhcHRlckxpc3RlbmVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGFkYXB0ZXJMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBlbXBsb3llZUxpc3RlbmVyID0gdGhpcy5idWlsZEVtcGxveWVlTGlzdGVuZXIoKTsKLQkJdGhpcy5lbXBsb3llZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVtcGxveWVlLk5BTUVfUFJPUEVSVFksIGVtcGxveWVlTGlzdGVuZXIpOwotCi0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGFkYXB0ZXJMaXN0ZW5lciA9IHRoaXMuYnVpbGRBZGFwdGVyTGlzdGVuZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihhZGFwdGVyTGlzdGVuZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGVtcGxveWVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpOwotCQl0aGlzLmVtcGxveWVlLmFkZENoYW5nZUxpc3RlbmVyKGVtcGxveWVlTGlzdGVuZXIpOwotCi0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiRnJlZGR5IiwgIlJpcGxleSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkNoYXJsaWUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJSaXBsZXkiLCAiQ2hhcmxpZSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQlhc3NlcnROdWxsKHRoaXMuYnVmZmVyZWRFdmVudCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGFwdGVyRXZlbnQsIHRoaXMubmFtZUFkYXB0ZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkZyZWRkeSIsICJDaGFybGllIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5lbXBsb3llZUV2ZW50LCB0aGlzLmVtcGxveWVlLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZLCAiRnJlZGR5IiwgIkNoYXJsaWUiKTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJKYXNvbiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkNoYXJsaWUiLCAiSmFzb24iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJpZ2dlci5yZXNldCgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkphc29uIiwgIkNoYXJsaWUiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2luZyB0aGUgdmFsdWUgc2hvdWxkIHRyaWdnZXIgYnVmZmVyaW5nCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR0aW5nIHRvIHRoZSBzYW1lIHZhbHVlIHNob3VsZCBub3QgdHJpZ2dlciBidWZmZXJpbmcgKD8pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzIoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiRnJlZGR5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0dGluZyB0byB0aGUgb3JpZ2luYWwgdmFsdWUgc2hvdWxkIG5vdCB0cmlnZ2VyIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nMygpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJGcmVkZHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBiYWNrLWRvb3IgY2hhbmdlcyBhcmUgaWdub3JlZCAtICJMYXN0IE9uZSBJbiBXaW5zIgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDb25mbGljdDEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZSgiSmFzb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXNvbiIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXNvbiIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQkvLyAiSmFzb24iIGlzIGRyb3BwZWQgb24gdGhlIGZsb29yLi4uCi0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogYmFjay1kb29yIGNoYW5nZXMgY2FuIGRlLWFjdGl2YXRlIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ29uZmxpY3QyKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVmZmVyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEFkYXB0ZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRhcHRlckV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZW1wbG95ZWVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5TmFtZSwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGludCBpZDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BST1BFUlRZID0gImlkIjsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgRGF0ZSBoaXJlRGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJUkVfREFURV9QUk9QRVJUWSA9ICJoaXJlRGF0ZSI7Ci0KLQkJRW1wbG95ZWUoaW50IGlkLCBTdHJpbmcgbmFtZSwgRGF0ZSBoaXJlRGF0ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmhpcmVEYXRlID0gaGlyZURhdGU7Ci0JCX0KLQkJaW50IGdldElEKCkgewotCQkJcmV0dXJuIHRoaXMuaWQ7Ci0JCX0KLQkJdm9pZCBzZXRJRChpbnQgaWQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmlkOwotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElEX1BST1BFUlRZLCBvbGQsIGlkKTsKLQkJfQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCURhdGUgZ2V0SGlyZURhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oaXJlRGF0ZTsKLQkJfQotCQl2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmhpcmVEYXRlOwotCQkJdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhJUkVfREFURV9QUk9QRVJUWSwgb2xkLCBoaXJlRGF0ZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTA3ZmQwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPihuZXcgUGVyc29uKCJLYXJlbiIsICJQZWdneSIsIG51bGwpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciA9IG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uLCBQZXJzb24+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPigpIHsKLQkJCXB1YmxpYyBQZXJzb24gdHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUGVyc29uIHJldmVyc2VUcmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRDaGlsZCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlQZXJzb24gcGVyc29uID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJLYXJlbiIsIHBlcnNvbi5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24xID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24xKTsKLQkJUGVyc29uIHBhcmVudDIgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24xLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50Mi5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjEuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQyLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMyA9IG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjMpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uMy5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50MyA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQzLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMy5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDMsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIGthcmVuID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJUGVyc29uIHBlZ2d5UGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlQZXJzb24gcGVnZ3kgPSBuZXcgUGVyc29uKCJQZWdneSIsICJNYXJpYW4iLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVnZ3kpOwotCQlQZXJzb24gbWFyaWFuUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBrYXJlbiwgcGVnZ3kpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgcGVnZ3lQYXJlbnQsIG1hcmlhblBhcmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCVBlcnNvbiBtYXR0ID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShtYXR0KTsKLQkJUGVyc29uIG1pdGNoUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBwZWdneSwgbWF0dCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBtYXJpYW5QYXJlbnQsIG1pdGNoUGFyZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG1hdHQsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbWl0Y2hQYXJlbnQsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShtYXR0KTsKLQkJbWl0Y2hQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsIG1hdHQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgbWl0Y2hQYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCQotCWNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OQU1FX1BST1BFUlRZID0gInBhcmVudE5hbWUiOwotCQkKLQkJcHJpdmF0ZSBQZXJzb24gY2hpbGQ7Ci0JCQotCQlwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgUGVyc29uIGNoaWxkKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNvbih0aGlzLnBhcmVudE5hbWUsIG51bGwsIHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBuZXdQYXJlbnROYW1lKSB7Ci0JCQlTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IG5ld1BhcmVudE5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBUkVOVF9OQU1FX1BST1BFUlRZLCBvbGRQYXJlbnROYW1lLCBuZXdQYXJlbnROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRDaGlsZCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTA1YzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4obmV3IFBlcnNvbigiS2FyZW4iLCAiUGVnZ3kiLCBudWxsKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIgPSBuZXcgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uLCBQZXJzb24+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPigpIHsKLQkJCXB1YmxpYyBQZXJzb24gdHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUGVyc29uIHJldmVyc2VUcmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRDaGlsZCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjEgPSBuZXcgUGVyc29uKCJNYXR0IiwgIk1pdGNoIiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjEpOwotCQlQZXJzb24gcGFyZW50MiA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjEuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQyLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMS5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24zID0gbmV3IFBlcnNvbigiS2FyZW4iLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMyk7Ci0JCWFzc2VydEVxdWFscygiS2FyZW4iLCBwZXJzb24zLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQzID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMy5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudDMuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24zLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50MywgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oIkNocmlzIiwgIk5vZWwiLCBudWxsKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24uZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMiA9IG5ldyBQZXJzb24oIkpvbiIsICJFbGl6YWJldGgiLCBudWxsKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24yLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjIuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIG9sZFBlcnNvbiA9IHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBvbGRQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBuZXdQZXJzb24gPSBuZXcgUGVyc29uKCJLYXJlbiIgLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobmV3UGVyc29uKTsKLQkJUGVyc29uIG5ld1BhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgb2xkUGVyc29uLCBuZXdQZXJzb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgb2xkUGFyZW50LCBuZXdQYXJlbnQpOwotCi0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXoiLCAiRm9vIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVoiLCAiRk9PIik7Ci0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZPTyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGb28iLCAiRk9PIik7Ci0vLwkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG51bGwsICJCQVIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCQotCWNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OQU1FX1BST1BFUlRZID0gInBhcmVudE5hbWUiOwotCQkKLQkJcHJpdmF0ZSBQZXJzb24gY2hpbGQ7Ci0JCQotCQlwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgUGVyc29uIGNoaWxkKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNvbih0aGlzLnBhcmVudE5hbWUsIG51bGwsIHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBuZXdQYXJlbnROYW1lKSB7Ci0JCQlTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IG5ld1BhcmVudE5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBUkVOVF9OQU1FX1BST1BFUlRZLCBvbGRQYXJlbnROYW1lLCBuZXdQYXJlbnROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRDaGlsZCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzMDA4ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGFhMTsKLQlwcml2YXRlIENvbGxlY3Rpb25FdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgU3RyaW5nIGV2ZW50MVR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lcyh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDFEZXNjcmlwdGlvbnMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWVzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MkRlc2NyaXB0aW9ucygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDFEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJlc3VsdC5hZGQoImJhbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QyRGVzY3JpcHRpb25zKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBBREQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgUkVNT1ZFKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBDTEVBUik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIENIQU5HRSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKENvbGxlY3Rpb25FdmVudCBlLCBTdHJpbmcgZXZlbnRUeXBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQkJdGhpcy5ldmVudDFUeXBlID0gZXZlbnRUeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFtIiwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkKCJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5hZGRBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJqYXoiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNQbHVzLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEucmVtb3ZlTmFtZSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJiYXIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXMoImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1czIgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzMi5hZGQoImphbSIpOwotCQluYW1lc1BsdXMyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMyLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfQ09MTEVDVElPTiA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGRlc2NyaXB0aW9uczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX0NPTExFQ1RJT04gPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5uYW1lcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25zID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJaWYgKHRoaXMubmFtZXMuYWRkKG5hbWUpKSB7Ci0JCQkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVTX0NPTExFQ1RJT04sIG5hbWUpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXdoaWxlIChuZXdOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZE5hbWUobmV3TmFtZXMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXRoaXMuYWRkTmFtZXMobmV3TmFtZXMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCWlmICh0aGlzLm5hbWVzLmFkZChuYW1lMSkgfCB0aGlzLm5hbWVzLmFkZChuYW1lMikpIHsKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChOQU1FU19DT0xMRUNUSU9OLCB0aGlzLm5hbWVzKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5yZW1vdmUobmFtZSkpIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChOQU1FU19DT0xMRUNUSU9OLCBuYW1lKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBkZXNjcmlwdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPih0aGlzLmRlc2NyaXB0aW9ucyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlpZiAodGhpcy5kZXNjcmlwdGlvbnMuYWRkKGRlc2NyaXB0aW9uKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChERVNDUklQVElPTlNfQ09MTEVDVElPTiwgZGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhJdGVyYXRvcjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJd2hpbGUgKG5ld0Rlc2NyaXB0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9ucy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhDb2xsZWN0aW9uPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9ucyhuZXdEZXNjcmlwdGlvbnMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlpZiAodGhpcy5kZXNjcmlwdGlvbnMucmVtb3ZlKGRlc2NyaXB0aW9uKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKERFU0NSSVBUSU9OU19DT0xMRUNUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQlwcml2YXRlIGNsYXNzIExvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiB7Ci0KLQkJTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yXygpIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvbnMoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0pIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZE5hbWUoaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZERlc2NyaXB0aW9uKGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVOYW1lKChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVEZXNjcmlwdGlvbigoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnJlbW92ZShzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzNTcwMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb24gPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJYmFnLmFkZCgiZm9vIik7Ci0JCWJhZy5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhiYWcpOwotCQlhc3NlcnRFcXVhbHMoMiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMoYmFnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU0M2Q5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHVibGljIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBMb2NhbEFkYXB0ZXIodGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciwgIjY2NiIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjExMSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMjIyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiNjY2Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFdmVudEZpcmluZygpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMTExIik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjIyMiIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChmYWxzZSwgdHJ1ZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWRhcHRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiB0aGUgdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaXRlbSwKLQkgKiBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIGZhbHNlCi0JICovCi0Jc3RhdGljIGNsYXNzIExvY2FsQWRhcHRlcgotCQlleHRlbmRzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4KLQl7Ci0JCXByaXZhdGUgU3RyaW5nIGl0ZW07Ci0KLQkJTG9jYWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nIGl0ZW0pIHsKLQkJCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQkvKioKLQkJICogYWx3YXlzIHJldHVybiBhIEJvb2xlYW4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJCUJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAocmVzdWx0ID09IG51bGwpID8gQm9vbGVhbi5GQUxTRSA6IHJlc3VsdDsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJaWYgKHRoaXMuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoICEgdGhpcy5ib29sZWFuVmFsdWVPZih2YWx1ZSkpIHsKLQkJCQkJLy8gdGhlIHZhbHVlIGlzIGNoYW5naW5nIGZyb20gdHJ1ZSB0byBmYWxzZQotCQkJCQkoKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuY29sbGVjdGlvbkhvbGRlcikucmVtb3ZlKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy5ib29sZWFuVmFsdWVPZih2YWx1ZSkpIHsKLQkJCQkJLy8gdGhlIHZhbHVlIGlzIGNoYW5naW5nIGZyb20gZmFsc2UgdG8gdHJ1ZQotCQkJCQkoKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuYWRkKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCksIHRoaXMuaXRlbSkpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQkJcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZU9mKHRoaXMudmFsdWUpOwotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWVPZihPYmplY3QgYikgewotCQkJcmV0dXJuIChiID09IG51bGwpID8gZmFsc2UgOiAoKEJvb2xlYW4pIGIpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMjhhMGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTmVpZ2hib3Job29kIG5laWdoYm9yaG9vZDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gbmVpZ2hib3Job29kSG9sZGVyOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2QgPSBuZXcgTmVpZ2hib3Job29kKCJIYW5uYS1CYXJiZXJhIik7Ci0JCXRoaXMubmVpZ2hib3Job29kSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+KHRoaXMubmVpZ2hib3Job29kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNoMSgpIHsKLQkJdGhpcy52ZXJpZnlTeW5jaCh0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaDIoKSB7Ci0JCXRoaXMudmVyaWZ5U3luY2godGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN5bmNoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gY29tcG9zaXRlQ1ZNKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCQlCYWc8RmFtaWx5PiBmYW1pbGllc1N5bmNoID0gbmV3IENvb3JkaW5hdGVkQmFnPEZhbWlseT4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcih0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCQlCYWc8TWVtYmVyPiBtZW1iZXJzU3luY2ggPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQotCQlGYW1pbHkgamV0c29ucyA9IHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5yZW1vdmVNZW1iZXIoamV0c29ucy5tZW1iZXJOYW1lZCgiQXN0cm8iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlqZXRzb25zLnJlbW92ZU1lbWJlcihqZXRzb25zLm1lbWJlck5hbWVkKCJKdWR5IikpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5hZGRNZW1iZXIoIkZpZG8iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMubmVpZ2hib3Job29kLnJlbW92ZUZhbWlseShqZXRzb25zKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoNywgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlGYW1pbHkgYmVhcnMgPSB0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkoIkJlYXIiKTsKLQkJCWJlYXJzLmFkZE1lbWJlcigiWW9naSIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWJlYXJzLmFkZE1lbWJlcigiQm9vLUJvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCU5laWdoYm9yaG9vZCBuMiA9IG5ldyBOZWlnaGJvcmhvb2QoIkhhbm5hLUJhcmJlcmEgMiIpOwotCQl0aGlzLm5laWdoYm9yaG9vZEhvbGRlci5zZXRWYWx1ZShuMik7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QobjIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKG4yLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhuMi5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vVHJhbnNmb3JtZXIoKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMSA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMiA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb248Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQoc3ViQ1ZNMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKHN1YkNWTTIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGNvbGxlY3Rpb24pKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hCYWcuc2l6ZSgpKTsKLQotCQlzdWJDVk0xLmFkZCgiZm9vIik7Ci0JCXN1YkNWTTEuYWRkKCJiYXIiKTsKLQkJc3ViQ1ZNMS5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiZm9vIikpOwotCi0JCXN1YkNWTTIuYWRkKCJqb28iKTsKLQkJc3ViQ1ZNMi5hZGQoImphciIpOwotCQlzdWJDVk0yLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImpheiIpKTsKLQotCQlzdWJDVk0xLnJlbW92ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShzeW5jaEJhZy5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVJdGVtKCkgewotCQlCYWc8TWVtYmVyPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxNZW1iZXI+KHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QodGhpcy5uZWlnaGJvcmhvb2QpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkodGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoImR1cGxpY2F0ZSBjb21wb25lbnQiKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBzeW5jaEJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBjb21wb3NpdGVDVk0gPSB0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkQmFnPE1lbWJlcj4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQkJRmFtaWx5IGpldHNvbnMgPSB0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIik7Ci0KLQkJYXNzZXJ0VHJ1ZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydEZhbHNlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydFRydWUoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVOZWlnaGJvcmhvb2QoTmVpZ2hib3Job29kIG4pIHsKLQkJRmFtaWx5IGZhbWlseTEgPSBuLmFkZEZhbWlseSgiRmxpbnRzdG9uZSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIkZyZWQiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJXaWxtYSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIlBlYmJsZXMiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJEaW5vIik7Ci0JCUZhbWlseSBmYW1pbHkyID0gbi5hZGRGYW1pbHkoIlJ1YmJsZSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJhcm5leSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJldHR5Iik7Ci0JCQlmYW1pbHkyLmFkZE1lbWJlcigiQmFtbS1CYW1tIik7Ci0JCUZhbWlseSBmYW1pbHkzID0gbi5hZGRGYW1pbHkoIkpldHNvbiIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkdlb3JnZSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkphbmUiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJKdWR5Iik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiRWxyb3kiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJBc3RybyIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5PiBidWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8TmVpZ2hib3Job29kLCBGYW1pbHk+KGNvbW11bmVIb2xkZXIsIE5laWdoYm9yaG9vZC5GQU1JTElFU19DT0xMRUNUSU9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGYW1pbHk+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmZhbWlsaWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZE1lbWJlcnNBZGFwdGVyKEZhbWlseSBmYW1pbHkpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxGYW1pbHksIE1lbWJlcj4oRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTiwgZmFtaWx5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm1lbWJlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQkvLyBvdmVycmlkZSAjdHJhbnNmb3JtKE9iamVjdCkKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJLy8gYnVpbGQgYSBjdXN0b20gVHJhbnNmb3JtZXIKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8RmFtaWx5LCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+PiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEZhbWlseSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPj4oKSB7Ci0JCQlwdWJsaWMgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTG9jYWwgVHJhbnNmb3JtZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmVpZ2hib3Job29kIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248RmFtaWx5PiBmYW1pbGllcyA9IG5ldyBBcnJheUxpc3Q8RmFtaWx5PigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxJRVNfQ09MTEVDVElPTiA9ICJmYW1pbGllcyI7Ci0JCi0JCXB1YmxpYyBOZWlnaGJvcmhvb2QoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPEZhbWlseT4gZmFtaWxpZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbGllcy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRGYW1pbHkobmV3IEZhbWlseShmYW1pbHlOYW1lKSk7Ci0JCX0KLQotCQkvLyBiYWNrZG9vciB0byBhbGxvdyBkdXBsaWNhdGVzCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KEZhbWlseSBmYW1pbHkpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIGZhbWlseTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgZmFtaWx5TmFtZWQoU3RyaW5nIGZhbWlseU5hbWUpIHsKLQkJCWZvciAoRmFtaWx5IGZhbWlseSA6IHRoaXMuZmFtaWxpZXMpIHsKLQkJCQlpZiAoZmFtaWx5LmdldE5hbWUoKS5lcXVhbHMoZmFtaWx5TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGZhbWlseTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZhbWlseU5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxNZW1iZXI+IGFsbE1lbWJlcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE1lbWJlcj4odGhpcy5tZW1iZXJzSXRlcmF0b3JzKCkpOwotCQl9Ci0JCi0JCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8TWVtYmVyPj4gbWVtYmVyc0l0ZXJhdG9ycygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGYW1pbHksIEl0ZXJhdG9yPE1lbWJlcj4+KHRoaXMuZmFtaWxpZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IHRyYW5zZm9ybShGYW1pbHkgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBmYW1pbHkubWVtYmVycygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgZmFtaWx5TmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmZhbWlseU5hbWVkKGZhbWlseU5hbWUpLm1lbWJlck5hbWVkKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBpbm5lciBjbGFzcwotCSAqLwotCXB1YmxpYyBjbGFzcyBGYW1pbHkgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUJFUlNfQ09MTEVDVElPTiA9ICJtZW1iZXJzIjsKLQkKLQkJcHVibGljIEZhbWlseShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8TWVtYmVyPiBtZW1iZXJzKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVycy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgYWRkTWVtYmVyKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlNZW1iZXIgbWVtYmVyID0gbmV3IE1lbWJlcihtZW1iZXJOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihtZW1iZXIsIHRoaXMubWVtYmVycywgTUVNQkVSU19DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBtZW1iZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihtZW1iZXIsIHRoaXMubWVtYmVycywgTUVNQkVSU19DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgTWVtYmVyIG1lbWJlck5hbWVkKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlmb3IgKE1lbWJlciBtZW1iZXIgOiB0aGlzLm1lbWJlcnMpIHsKLQkJCQlpZiAobWVtYmVyLmdldE5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLQkJCQkJcmV0dXJuIG1lbWJlcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCQotCX0KLQotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTWVtYmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBNZW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTIyM2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTA7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTE7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTI7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTM7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiB1YmVyTFZNOwotCXByaXZhdGUgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPiBjb21wb3NpdGVMVk07Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMubHZtMCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMC5hZGQoImFhYSIpOwotCQl0aGlzLmx2bTAuYWRkKCJiYmIiKTsKLQkJdGhpcy5sdm0wLmFkZCgiY2NjIik7Ci0KLQkJdGhpcy5sdm0xID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0xLmFkZCgiZGRkIik7Ci0JCXRoaXMubHZtMS5hZGQoImVlZSIpOwotCi0JCXRoaXMubHZtMiA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMi5hZGQoImZmZiIpOwotCi0JCXRoaXMubHZtMyA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMy5hZGQoImdnZyIpOwotCQl0aGlzLmx2bTMuYWRkKCJoaGgiKTsKLQkJdGhpcy5sdm0zLmFkZCgiaWlpIik7Ci0JCXRoaXMubHZtMy5hZGQoImpqaiIpOwotCQl0aGlzLmx2bTMuYWRkKCJra2siKTsKLQotCQl0aGlzLnViZXJMVk0gPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTApOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMSk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0yKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTMpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNID0gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oKExpc3RWYWx1ZU1vZGVsPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KSB0aGlzLnViZXJMVk0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBjb29yZExpc3QuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMikpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGNvb3JkTGlzdC5nZXQoMikpOwotCi0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCi0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBjb29yZExpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTEgPSBjb29yZExpc3QuaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSB0aGlzLmNvbXBvc2l0ZUxWTS5pdGVyYXRvcigpOyBzdHJlYW0yLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCQlhc3NlcnRGYWxzZShzdHJlYW0xLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBjb29yZExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZCgwLCBsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZCgyLCBsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUEuYWRkKCJ4eHgiKTsKLQkJbHZtQS5hZGQoInl5eSIpOwotCQlsdm1BLmFkZCgienp6Iik7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQiA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUIuYWRkKCJwcHAiKTsKLQkJbHZtQi5hZGQoInFxcSIpOwotCQlsdm1CLmFkZCgicnJyIik7Ci0JCUNvbGxlY3Rpb248U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gYyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJYy5hZGQobHZtQSk7Ci0JCWMuYWRkKGx2bUIpOwotCQl0aGlzLnViZXJMVk0uYWRkQWxsKDIsIGMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAicHBwIiwgInFxcSIsICJycnIiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDIsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUEgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1BLmFkZCgieHh4Iik7Ci0JCWx2bUEuYWRkKCJ5eXkiKTsKLQkJbHZtQS5hZGQoInp6eiIpOwotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1CLmFkZCgicHBwIik7Ci0JCWx2bUIuYWRkKCJxcXEiKTsKLQkJbHZtQi5hZGQoInJyciIpOwotCQlMaXN0PFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGx2bUEpOwotCQlsaXN0LmFkZChsdm1CKTsKLQkJdGhpcy51YmVyTFZNLnNldCgyLCBsaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgInBwcCIsICJxcXEiLCAicnJyIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygicXFxIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxcXEiLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMCwgMiwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgxKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX01pZGRsZSgpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMSwgMywgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX0VuZCgpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMywgMCwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2UoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImRkZCIsICJlZWUiLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDE0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlcygpIHsKLQkJTGlzdDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQluZXdMaXN0LmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5zZXRMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkKDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5hZGQoMSwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmFkZCg1LCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkQWxsKDAsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuYWRkQWxsKDEsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuYWRkQWxsKDUsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiLCAieXl5IiwgInp6eiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoMSwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDMsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuc2V0KDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoNCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAieHh4IiwgInl5eSIsICJ6enoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEwKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCgxMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJ5eXkiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgyLCAwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImFhYSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5tb3ZlKDAsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImVlZSIsICJkZGQiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLm1vdmUoMCwgNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAia2trIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgxLCAwLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJjY2MiLCAiYWFhIiwgImJiYiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMSIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMiIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMyIpOwotCQl0aGlzLmx2bTEubW92ZSgxLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlLjEiLCAiZWVlLjIiLCAiZWVlLjMiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMubW92ZSgwLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJpaWkiLCAiampqIiwgImtrayIsICJnZ2ciLCAiaGhoIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuc2V0TGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI4YjA5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBwdm0xOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bTM7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBwdm00OwotCXByaXZhdGUgQ29sbGVjdGlvbjxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4gY29sbGVjdGlvbjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PiBjdm07Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gY29tcG9zaXRlUFZNOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQotCXB1YmxpYyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnB2bTEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZigxKSk7Ci0JCXRoaXMucHZtMiA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDIpKTsKLQkJdGhpcy5wdm0zID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoMykpOwotCQl0aGlzLnB2bTQgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZig0KSk7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+KCk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0xKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTIpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMyk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm00KTsKLQkJdGhpcy5jdm0gPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+KHRoaXMuY29sbGVjdGlvbik7Ci0JCQotCQl0aGlzLmNvbXBvc2l0ZVBWTSA9IHRoaXMuYnVpbGRDb21wb3NpdGVQVk0oY3ZtKTsKLQl9Ci0KLQlwcml2YXRlIDxUIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRDb21wb3NpdGVQVk0oQ29sbGVjdGlvblZhbHVlTW9kZWw8VD4gcHZtcykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihwdm1zKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZSgpIHsKLQkJCQlpbnQgc3VtID0gMDsKLQkJCQlmb3IgKE9iamVjdCBlYWNoIDogdGhpcy5jb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQkJCXN1bSArPSAoKFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPikgZWFjaCkuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHN1bSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQW5kTGlzdGVuZXJzMSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQW5kTGlzdGVuZXJzMigpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnB2bTEuc2V0VmFsdWUoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgxMCwgMTQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnB2bTQuc2V0VmFsdWUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgxNCwgMTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMSgpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoNzcpKTsKLQkJdGhpcy5jdm0uYWRkKHB2bSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTAsIDg3KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0ucmVtb3ZlKHB2bSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoODcsIDEwKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0uY2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgxMCwgMCk7Ci0KLQkJQ29sbGVjdGlvbjxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4gYzIgPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PigpOwotCQljMi5hZGQodGhpcy5wdm0xKTsKLQkJYzIuYWRkKHRoaXMucHZtMik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5zZXRWYWx1ZXMoYzIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KDAsIDMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nMSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nMigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29tcG9zaXRlUFZNLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2Yob2xkVmFsdWUpLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKG5ld1ZhbHVlKSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1ZmFkNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQga2VlcHMgYW4gaW50ZXJuYWwgY29sbGVjdGlvbiBpbiBzeW5jaCB3aXRoIHRoZQotICogY29sbGVjdGlvbiBoZWxkIGJ5IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLSAqLwotY2xhc3MgQ29vcmRpbmF0ZWRCYWc8RT4gaW1wbGVtZW50cyBCYWc8RT4sIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPigpOwotCi0JQ29vcmRpbmF0ZWRCYWcoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY3ZtKSB7Ci0JCWN2bS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZEFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJldGFpbkFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheShhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFnIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvdW50KG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkKG8sIGNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8sIGNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChFIGl0ZW0gOiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCXRoaXMuYmFnLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChFIGl0ZW0gOiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCXRoaXMuYmFnLnJlbW92ZShpdGVtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsICgoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4pIGV2ZW50LmdldFNvdXJjZSgpKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmVxdWFscyhvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVhMjk4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQga2VlcHMgYW4gaW50ZXJuYWwgbGlzdCBpbiBzeW5jaCB3aXRoIHRoZQotICogbGlzdCBoZWxkIGJ5IGEgbGlzdCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIENvb3JkaW5hdGVkTGlzdDxFPiBpbXBsZW1lbnRzIExpc3Q8RT4sIExpc3RDaGFuZ2VMaXN0ZW5lciwgTGlzdERhdGFMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0KLQlwdWJsaWMgQ29vcmRpbmF0ZWRMaXN0KExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RWYWx1ZU1vZGVsKSB7Ci0JCWxpc3RWYWx1ZU1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gbGlzdFZhbHVlTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb29yZGluYXRlZExpc3QoTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlsaXN0TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcih0aGlzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxpc3RNb2RlbCwgaSkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRoaXMubGlzdC5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmFkZEFsbChpbmRleCwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGFzdEluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZUFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmV0YWluQWxsKGMpOwotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheShhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhlKSkgewotCQkJdGhpcy5saXN0LmFkZChpKyssIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCWludCBiYXNlID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKGludCBpID0gZS5nZXRJdGVtc1NpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKGJhc2UgKyBpKTsgIC8vIHJlbW92ZSBmcm9tIGVuZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhlKSkgewotCQkJdGhpcy5saXN0LnNldChpKyssIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5saXN0LCBlLmdldFRhcmdldEluZGV4KCksIGUuZ2V0U291cmNlSW5kZXgoKSwgZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIHRoaXMuZ2V0U291cmNlKGUpLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0RGF0YUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNvbnRlbnRzQ2hhbmdlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUxpc3RNb2RlbCBsbSA9IChMaXN0TW9kZWwpIGUuZ2V0U291cmNlKCk7Ci0JCWludCBzaXplID0gbG0uZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdGhpcy5saXN0LmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsbSwgaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW50ZXJ2YWxBZGRlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJTGlzdE1vZGVsIGxtID0gKExpc3RNb2RlbCkgZS5nZXRTb3VyY2UoKTsKLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4oZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBlbmQgPSBNYXRoLm1heChlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxtLCBpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcnZhbFJlbW92ZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBzdGFydCArIDE7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHN0YXJ0KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmVxdWFscyhvKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmhhc2hDb2RlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncy49Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFIGdldEVsZW1lbnRBdChMaXN0TW9kZWwgbGlzdE1vZGVsLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChFKSBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MuPQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RT4gZ2V0U291cmNlKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RWYWx1ZU1vZGVsPEU+KSBldmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjQ1MDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gZXh0ZW5kZWRMaXN0SG9sZGVyOwotCUxpc3RFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRFeHRlbmRlZExpc3RIb2xkZXIodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoIkMiKTsKLQkJcmVzdWx0LmFkZCgiRCIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkRXh0ZW5kZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZFByZWZpeCgpKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkU3VmZml4KCkpOwotCQlyZXR1cm4gZXh0ZW5kZWRMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUHJlZml4KCkgewotCQlMaXN0PFN0cmluZz4gcHJlZml4ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXByZWZpeC5hZGQoIngiKTsKLQkJcHJlZml4LmFkZCgieSIpOwotCQlwcmVmaXguYWRkKCJ6Iik7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdWZmaXgoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzdWZmaXggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3VmZml4LmFkZCgiaSIpOwotCQlzdWZmaXguYWRkKCJqIik7Ci0JCXJldHVybiBzdWZmaXg7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXh0ZW5kZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCXJldHVybiBuZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJlZml4KCksIGx2bSwgdGhpcy5idWlsZFN1ZmZpeCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKS5zaXplKCksIHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRMaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGV4dGVuZGVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLS8vCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0vLwkJCWlmIChleHRlbmRlZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0JcHVibGljIHZvaWQgdGVzdEFkZDEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkUiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgIkUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJFIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJFIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQyKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhZGRMaXN0LmFkZCgiRSIpOwotCQlhZGRMaXN0LmFkZCgiRiIpOwotCQlyZXR1cm4gYWRkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoNCwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJCIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJCIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiQiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZUdlbmVyaWMoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VOYW1lZCgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDQsICJFIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCA3LCAiRSIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCA4LCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgOCwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDcsICJFIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgwLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QoKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkpKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0KDAsICJBQSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiQSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiQUEiKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlKSB7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCB0aGlzLmV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0eXBlKTsKLQkJaWYgKHR5cGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCS8qCi0JCSAqIGFkZGluZyBsaXN0ZW5lcnMgdG8gdGhlIGV4dGVuZGVkIGxpc3Qgd2lsbCBjYXVzZSBsaXN0ZW5lcnMKLQkJICogdG8gYmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdDsKLQkJICogbGlrZXdpc2UsIHJlbW92aW5nIGxpc3RlbmVycyBmcm9tIHRoZSBleHRlbmRlZCBsaXN0IHdpbGwKLQkJICogY2F1c2UgbGlzdGVuZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0Ci0JCSAqLwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjAzMDEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0JQ29sbGVjdGlvbkFkZEV2ZW50IGFkZEV2ZW50OwotCUNvbGxlY3Rpb25SZW1vdmVFdmVudCByZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBjb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBjb2xsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgZmlsdGVyZWRBZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZmlsdGVyZWRSZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBmaWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KGJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRoaXMuYnVpbGRGaWx0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyVmFsdWUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uSG9sZGVyVmFsdWUubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb2xsZWN0aW9uSG9sZGVyVmFsdWUubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKG5ld0NvbGxlY3Rpb24pOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gY29sbGVjdGlvblZhbHVlcyA9IHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZveCIsIGNvbGxlY3Rpb25WYWx1ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzID0gdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBmaWx0ZXJlZENvbGxlY3Rpb25WYWx1ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRGaWx0ZXJlZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRGaWx0ZXJlZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckV2ZW50cygpIHsKLQkJdGhpcy5hZGRFdmVudCA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gdGVtcENvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkQWRkRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCQotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJiYXIiKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnJlbW92ZUV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQpOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEFkZEV2ZW50KTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQkJCi0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5yZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEZpbHRlcmVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEZpbHRlcmVkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBpdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaXRlbXMsIENvbGxlY3Rpb25Ub29scy52ZWN0b3IoZXZlbnQuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBpdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaXRlbXMsIENvbGxlY3Rpb25Ub29scy52ZWN0b3IoZXZlbnQuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaWx0ZXJlZEl0ZW0oKSB7Ci0JCS8vIGJ1aWxkIGNvbGxlY3Rpb24gd2l0aCBUZXN0SXRlbXMKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+IHRpSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPih0aGlzLmJ1aWxkQ29sbGVjdGlvbjIoKSk7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPiBmaWx0ZXJlZFRJSG9sZGVyID0gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPih0aUhvbGRlciwgdGhpcy5idWlsZEZpbHRlcjIoKSk7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJZmlsdGVyZWRUSUhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCi0JCXRpSG9sZGVyLmFkZChuZXcgVGVzdEl0ZW0oImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQotCQlUZXN0SXRlbSBiYXogPSBuZXcgVGVzdEl0ZW0oImJheiIpOwotCQl0aUhvbGRlci5hZGQoYmF6KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQkJLy8gYmVmb3JlIHJlbW92aW5nIGl0LCBjaGFuZ2UgdGhlIGl0ZW0gc28gdGhhdCBpdCBpcyBmaWx0ZXJlZAotCQliYXoubmFtZSA9ICJqYXoiOwotCQl0aUhvbGRlci5yZW1vdmUoYmF6KTsKLQkJLy8gdGhpcyB3b3VsZCBmYWlsIGJlY2F1c2UgdGhlIGl0ZW0gd2FzIG5vdCByZW1vdmVkIGZyb20KLQkJLy8gdGhlIGZpbHRlcmVkIGNvbGxlY3Rpb24gY2FjaGUuLi4gYnV0IHdlJ3ZlIGZpeGVkIGl0IG5vdwotCQlhc3NlcnRFcXVhbHMoMSwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxUZXN0SXRlbT4gYnVpbGRDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvbjxUZXN0SXRlbT4gY29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8VGVzdEl0ZW0+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBUZXN0SXRlbSgiZm9vIikpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxUZXN0SXRlbT4gYnVpbGRGaWx0ZXIyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxUZXN0SXRlbT4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVGVzdEl0ZW0gdGkpIHsKLQkJCQlyZXR1cm4gdGkubmFtZS5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRlc3RJdGVtIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgVGVzdEl0ZW0gewotCQlTdHJpbmcgbmFtZTsKLQkJVGVzdEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzZkZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZmlsdGVyZWRPYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBmaWx0ZXJlZEV2ZW50OwotCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciA9IG5ldyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQmlkaUZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEJpZGlGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiAocyAhPSBudWxsKSAmJiBzLnN0YXJ0c1dpdGgoImIiKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgImJheiIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9wIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiZm9wIik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb3AiLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkRXZlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzVkM2MxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoImJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJiYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygiam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoImphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJqYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoImRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJoYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoImJhciIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigienp6Iik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigienp6Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0NPTExFQ1RJT04gPSAic3R1ZmYiOwotCQkJCi0JCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JCX0KLQkKLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFhN2Y4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoImJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJiYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygiam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoImphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJqYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoImRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJoYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoImJhciIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigienp6Iik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigienp6Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0xJU1QgPSAic3R1ZmYiOwotCQkJCi0JCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJCWZpcmVJdGVtQWRkZWQoU1RVRkZfTElTVCwgdGhpcy5zdHVmZi5pbmRleE9mKHN0dWZmSXRlbSksIHN0dWZmSXRlbSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCWludCBpbmRleCA9IHRoaXMuc3R1ZmYuaW5kZXhPZihzdHVmZkl0ZW0pOwotCQkJdGhpcy5zdHVmZi5yZW1vdmUoc3R1ZmZJdGVtKTsKLQkJCWZpcmVJdGVtUmVtb3ZlZChTVFVGRl9MSVNULCBpbmRleCwgc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQkJfQotCQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIG8pIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8oby5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwY2VkOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBmb287Ci0JcHJpdmF0ZSBKdW5rIGJhcjsKLQlwcml2YXRlIEp1bmsgYmF6OwotCXByaXZhdGUgSnVuayBqb287Ci0JcHJpdmF0ZSBKdW5rIGphcjsKLQlwcml2YXRlIEp1bmsgamF6OwotCi0JcHJpdmF0ZSBKdW5rIHRvbTsKLQlwcml2YXRlIEp1bmsgZGljazsKLQlwcml2YXRlIEp1bmsgaGFycnk7Ci0KLQlwdWJsaWMgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygidGhpcy5mb28iKTsKLQkJdGhpcy5iYXIgPSBuZXcgSnVuaygidGhpcy5iYXIiKTsKLQkJdGhpcy5iYXogPSBuZXcgSnVuaygidGhpcy5iYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygidGhpcy5qb28iKTsKLQkJdGhpcy5qYXIgPSBuZXcgSnVuaygidGhpcy5qYXIiKTsKLQkJdGhpcy5qYXogPSBuZXcgSnVuaygidGhpcy5qYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0aGlzLnRvbSIpOwotCQl0aGlzLmRpY2sgPSBuZXcgSnVuaygidGhpcy5kaWNrIik7Ci0JCXRoaXMuaGFycnkgPSBuZXcgSnVuaygidGhpcy5oYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihjb2xsZWN0aW9uSG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCS8vIHRlc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uCi0JCWxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8SnVuaz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SnVuaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSnVuayBvMSwgSnVuayBvMikgewotCQkJCXJldHVybiBvMi5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8xLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RTb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obGlzdEhvbGRlciwgY29tcGFyYXRvciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKHRoaXMuYnVpbGRMaXN0KCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QsIENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8SnVuaz4gc3MgPSBuZXcgVHJlZVNldDxKdW5rPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJc3MuYWRkKGxpc3RWYWx1ZU1vZGVsLmdldChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEp1bms+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCWxpc3RWYWx1ZU1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obGlzdEhvbGRlciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgienp6Iik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgidGhpcy5iYXIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSwgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKEp1bmsgbykgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTVjMzZiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoInRoaXMuZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoInRoaXMuYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoInRoaXMuYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoInRoaXMuam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoInRoaXMuamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoInRoaXMuamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidGhpcy50b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoInRoaXMuZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoInRoaXMuaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKdW5rPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxKdW5rPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShKdW5rIG8xLCBKdW5rIG8yKSB7Ci0JCQkJcmV0dXJuIG8yLmNvbXBhcmVUbyhvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RTb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obGlzdEhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCwgQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxKdW5rPiBzcyA9IG5ldyBUcmVlU2V0PEp1bms+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQobGlzdFZhbHVlTW9kZWwuZ2V0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8SnVuaz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ6enoiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ0aGlzLmJhciIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIGopIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvKGoubmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0pwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExNTJkOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0pwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLkpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuc3VpdGUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0QXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0Q3VyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5UcmFuc2Zvcm1lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVMaXN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M2NzE4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QxOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIxOwotCXByaXZhdGUgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBhYTE7Ci0JcHJpdmF0ZSBMaXN0RXZlbnQgZXZlbnQxOwotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQlwdWJsaWMgTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZXModGhpcy5zdWJqZWN0MU5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QxRGVzY3JpcHRpb25zKCkpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWVzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MkRlc2NyaXB0aW9ucygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJlc3VsdC5hZGQoImJhbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxRGVzY3JpcHRpb25zKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXN1bHQuYWRkKCJqYW0iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MkRlc2NyaXB0aW9ucygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0QXNwZWN0QWRhcHRlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChMaXN0RXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUoImphbSIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamFtIiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkKCJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZCgyLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNQbHVzLmFkZCgyLCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWl0ZW1zLmFkZCgiam9vIik7Ci0JCWl0ZW1zLmFkZCgiamFyIik7Ci0JCWl0ZW1zLmFkZCgiamF6Iik7Ci0JCWl0ZW1zLmFkZCgiamFtIik7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmFhMS5hZGRBbGwoMiwgaXRlbXMpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwkJLy8gb25seSB0aGUgbGFzdCAiYWRkIiBldmVudCB3aWxsIHN0aWxsIGJlIHRoZXJlCi0JCWFzc2VydEVxdWFscygiamFtIiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkQWxsKDIsIGl0ZW1zKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCVN0cmluZyByZW1vdmVkTmFtZSA9IHRoaXMuc3ViamVjdDEucmVtb3ZlTmFtZSgwKTsJLy8gc2hvdWxkIGJlICJmb28iCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkTmFtZSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJT2JqZWN0IHJlbW92ZWRJdGVtID0gdGhpcy5hYTEucmVtb3ZlKDApOwkKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWRJdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWl0ZW1zLmFkZCgiYmFyIik7Ci0JCWl0ZW1zLmFkZCgiYmF6Iik7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmFhMS5yZW1vdmUoMSwgMik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7CQkvLyBvbmx5IHRoZSBsYXN0ICJyZW1vdmUiIGV2ZW50IHdpbGwgc3RpbGwgYmUgdGhlcmUKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5yZW1vdmUoMSk7Ci0JCW5hbWVzUGx1cy5yZW1vdmUoMSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlcGxhY2VkTmFtZSA9IHRoaXMuc3ViamVjdDEuc2V0TmFtZSgwLCAiamVsbHkiKTsJLy8gc2hvdWxkIGJlICJmb28iCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImplbGx5IiwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0TmV3SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyZXBsYWNlZE5hbWUsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNDaGFuZ2VkID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMCwgImplbGx5Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc0NoYW5nZWQsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQlyZXBsYWNlZE5hbWUgPSB0aGlzLnN1YmplY3QxLnNldE5hbWUoMSwgInJvbGwiKTsJLy8gc2hvdWxkIGJlICJiYXIiCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoInJvbGwiLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlcGxhY2VkTmFtZSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCW5hbWVzQ2hhbmdlZCA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc0NoYW5nZWQuc2V0KDAsICJqZWxseSIpOwotCQluYW1lc0NoYW5nZWQuc2V0KDEsICJyb2xsIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc0NoYW5nZWQsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRUd29OYW1lcygiamFtIiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMyID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1czIuYWRkKDAsICJqYXoiKTsKLQkJbmFtZXNQbHVzMi5hZGQoMCwgImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzMiwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLmFhMS5nZXQoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQl0aGlzLmFhMS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gbmFtZXM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBkZXNjcmlwdGlvbnM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OU19MSVNUID0gImRlc2NyaXB0aW9ucyI7Ci0JCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMubmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLmdldChpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWVzLmFkZChpbmRleCwgbmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTkFNRVNfTElTVCwgaW5kZXgsIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkTmFtZSh0aGlzLm5hbWVzLnNpemUoKSwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXdoaWxlIChuZXdOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZE5hbWUobmV3TmFtZXMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhMaXN0PFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXRoaXMuYWRkTmFtZXMobmV3TmFtZXMubGlzdEl0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFR3b05hbWVzKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCQl0aGlzLm5hbWVzLmFkZCgwLCBuYW1lMik7Ci0JCQl0aGlzLm5hbWVzLmFkZCgwLCBuYW1lMSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChOQU1FU19MSVNULCB0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWUoaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgcmVtb3ZlZE5hbWUgPSB0aGlzLm5hbWVzLnJlbW92ZShpbmRleCk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChOQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZE5hbWUpOwotCQkJcmV0dXJuIHJlbW92ZWROYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgc2V0TmFtZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgcmVwbGFjZWROYW1lID0gdGhpcy5uYW1lcy5zZXQoaW5kZXgsIG5hbWUpOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKE5BTUVTX0xJU1QsIGluZGV4LCBuYW1lLCByZXBsYWNlZE5hbWUpOwotCQkJcmV0dXJuIHJlcGxhY2VkTmFtZTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gZGVzY3JpcHRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuZGVzY3JpcHRpb25zKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb25zLmdldChpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oaW50IGluZGV4LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb25zLmFkZChpbmRleCwgZGVzY3JpcHRpb24pOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5hZGREZXNjcmlwdGlvbih0aGlzLmRlc2NyaXB0aW9ucy5zaXplKCksIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbnMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl3aGlsZSAobmV3RGVzY3JpcHRpb25zLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb25zLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKExpc3Q8U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb25zKG5ld0Rlc2NyaXB0aW9ucy5saXN0SXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVEZXNjcmlwdGlvbihpbnQgaW5kZXgpIHsKLQkJCVN0cmluZyByZW1vdmVkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9ucy5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoREVTQ1JJUFRJT05TX0xJU1QsIGluZGV4LCByZW1vdmVkRGVzY3JpcHRpb24pOwotCQkJcmV0dXJuIHJlbW92ZWREZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHNldERlc2NyaXB0aW9uKGludCBpbmRleCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlTdHJpbmcgcmVwbGFjZWREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25zLnNldChpbmRleCwgZGVzY3JpcHRpb24pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgZGVzY3JpcHRpb24sIHJlcGxhY2VkRGVzY3JpcHRpb24pOwotCQkJcmV0dXJuIHJlcGxhY2VkRGVzY3JpcHRpb247Ci0JCX0KLQl9Ci0KLQotCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCWNsYXNzIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgZXh0ZW5kcyBMaXN0QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiB7Ci0KLQkJTG9jYWxMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvbnMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGROYW1lKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkRGVzY3JpcHRpb24oaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQWxsKGludCBpbmRleCwgTGlzdDxTdHJpbmc+IGl0ZW1zKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJdGhpcy5hZGQoaW5kZXggKyBpLCBpdGVtcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucmVtb3ZlTmFtZShpbmRleCk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5yZW1vdmVEZXNjcmlwdGlvbihpbmRleCk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IHJlbW92ZShpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJCUxpc3Q8U3RyaW5nPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlyZW1vdmVkSXRlbXMuYWRkKHRoaXMucmVtb3ZlKGluZGV4KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVtb3ZlZEl0ZW1zOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZXBsYWNlKGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zZXROYW1lKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNldERlc2NyaXB0aW9uKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDgzZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZExpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gd3JhcHBlZExpc3Q7Ci0KLQlwdWJsaWMgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3QpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy53cmFwcGVkTGlzdC5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZXMoKSB7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoNSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLml0ZXJhdG9yKCksICJqb28iKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscygiam9vIiwgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMywgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYWRhcHRlci5zaXplKCkpOwotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImZvbyIpOwotCQlsaXN0LmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhsaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKGxpc3QpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Y2U0NmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEN1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdEN1cmF0b3JUZXN0cyAKLQlleHRlbmRzIFRlc3RDYXNlIAotewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JCi0JcHJpdmF0ZSBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBjdXJhdG9yOwotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQlwcml2YXRlIExpc3RFdmVudCBldmVudDE7Ci0JCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBMaXN0Q3VyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QodGhpcy5zdWJqZWN0MU5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuY3VyYXRvciA9IHRoaXMuYnVpbGRMaXN0Q3VyYXRvcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmN1cmF0b3IuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QodGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJhbHBoYSIpOwotCQlsaXN0LmFkZCgiYnJhdm8iKTsKLQkJbGlzdC5hZGQoImNoYXJsaWUiKTsKLQkJbGlzdC5hZGQoImRlbHRhIik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJlY2hvIik7Ci0JCWxpc3QuYWRkKCJmb3h0cm90Iik7Ci0JCWxpc3QuYWRkKCJnbG92ZSIpOwotCQlsaXN0LmFkZCgiaG90ZWwiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgTGlzdEN1cmF0b3I8VGVzdFN1YmplY3QsIFN0cmluZz4gYnVpbGRMaXN0Q3VyYXRvcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yRm9yUmVjb3JkKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3RyaW5ncygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoTGlzdEV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFN0cmluZygiZWNobyIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImVjaG8iLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gc3RyaW5nc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJc3RyaW5nc1BsdXMuYWRkKCJlY2hvIik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLmFkZFN0cmluZygwLCAienVsdSIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6dWx1IiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJc3RyaW5nc1BsdXMuYWRkKDAsICJ6dWx1Iik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCVN0cmluZyByZW1vdmVkU3RyaW5nID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVTdHJpbmcoMCk7CS8vIHNob3VsZCBiZSAiYWxwaGEiCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZFN0cmluZywgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IHN0cmluZ3NNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQlzdHJpbmdzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXJlbW92ZWRTdHJpbmcgPSB0aGlzLnN1YmplY3QxLnJlbW92ZVN0cmluZygyKTsJLy8gc2hvdWxkIGJlICJkZWx0YSIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkU3RyaW5nLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlzdHJpbmdzTWludXMucmVtb3ZlKDIpOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlTGlzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCQotCQl0aGlzLnN1YmplY3QxLnNldFN0cmluZ3ModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlMaXN0PFN0cmluZz4gbmV3U3RyaW5ncyA9IHRoaXMuc3ViamVjdDJOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMobmV3U3RyaW5ncywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsTGlzdENoYW5nZSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN0YXJ0aW5nTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgc3RhcnRpbmdMaXN0KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCQotCQlTdHJpbmcgaWRlbnRpY2FsU3RyaW5nID0gc3RhcnRpbmdMaXN0LmdldCgxKTsgIC8vIHNob3VsZCBiZSAiYnJhdm8iCi0JCVN0cmluZyBub25pZGVudGljYWxTdHJpbmcgPSBzdGFydGluZ0xpc3QuZ2V0KDApOyAvLyBzaG91bGQgYmUgImFscGhhIgotCQlMaXN0PFN0cmluZz4gbmV3U3RyaW5ncyA9IENvbGxlY3Rpb25Ub29scy5saXN0KG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZygiYnJhdm8iKSwgbmV3IFN0cmluZygiYWxwaGEiKSwgImVjaG8iLCAiZGVsdGEiLCAiZm94dHJvdCJ9KTsKLQkJdGhpcy5zdWJqZWN0MS5zZXRTdHJpbmdzKG5ld1N0cmluZ3MpOwotCQkKLQkJTGlzdDxTdHJpbmc+IGZpbmFsTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdTdHJpbmdzLCBmaW5hbExpc3QpOwotCQlhc3NlcnRUcnVlKGlkZW50aWNhbFN0cmluZyA9PSBmaW5hbExpc3QuZ2V0KDApKTsKLQkJYXNzZXJ0VHJ1ZShub25pZGVudGljYWxTdHJpbmcgIT0gZmluYWxMaXN0LmdldCgxKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnN1YmplY3QxLnN0cmluZ3MoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLnN1YmplY3QxLmdldFN0cmluZygwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuY3VyYXRvci5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5zdHJpbmdzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIHRoaXMuY3VyYXRvci5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5jdXJhdG9yLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmN1cmF0b3IuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuY3VyYXRvci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKiogSW5uZXIgQ2xhc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCWNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0cmluZ3M7Ci0JCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLnN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfQotCQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCQl0aGlzKCk7Ci0JCQl0aGlzLnNldFN0cmluZ3Moc3RyaW5ncyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuc3RyaW5ncy5nZXQoaW5kZXgpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdHJpbmcoaW50IGluZGV4LCBTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnN0cmluZ3MuYWRkKGluZGV4LCBzdHJpbmcpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZFN0cmluZyh0aGlzLnN0cmluZ3Muc2l6ZSgpLCBzdHJpbmcpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZVN0cmluZyhpbnQgaW5kZXgpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSB0aGlzLnN0cmluZ3MuZ2V0KGluZGV4KTsKLQkJCXRoaXMucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5zdHJpbmdzLnJlbW92ZShzdHJpbmcpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFN0cmluZ3MoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzdHJpbmdzKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHN0cmluZ3MpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiY2M3MzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQlwdWJsaWMgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gbmV3IE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJiZjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbExpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T2JqZWN0PiBsaXN0SG9sZGVyOwotCi0JcHVibGljIE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBOdWxsTGlzdFZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIuZ2V0KDApOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0ODUwNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQotCXB1YmxpYyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWJjODMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBhYTE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBtdWx0aXBsZVZhbHVlRXZlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY3VzdG9tVmFsdWVFdmVudDsKLQotCi0JcHVibGljIFByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoImZvbyIsICJ0ZXN0IHN1YmplY3QgMSIpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gKHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgiYmFyIiwgInRlc3Qgc3ViamVjdCAyIik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkvLyB0aGlzIGlzIG5vdCBhIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5wcm9wZXJ0eU5hbWVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMucHJvcGVydHlOYW1lc1swXSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKCJiYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5hYTEuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBc3BlY3RBZGFwdGVyKCkgewotCQlUZXN0U3ViamVjdCB0ZXN0U3ViamVjdCA9IG5ldyBUZXN0U3ViamVjdCgiZnJlZCIsICJodXNiYW5kIik7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiB0ZXN0U3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRlc3RTdWJqZWN0KTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXN0QUEgPSB0aGlzLmJ1aWxkTXVsdGlwbGVBc3BlY3RBZGFwdGVyKHRlc3RTdWJqZWN0SG9sZGVyKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0ZXN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkTXVsdGlwbGVWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRlc3RBQS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGVzdExpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkOmh1c2JhbmQiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBudWxsOwotCQl0ZXN0U3ViamVjdC5zZXROYW1lKCJ3aWxtYSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOmh1c2JhbmQiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZDpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCi0JCXRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50ID0gbnVsbDsKLQkJdGVzdFN1YmplY3Quc2V0RGVzY3JpcHRpb24oIndpZmUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTp3aWZlIiwgdGVzdEFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTp3aWZlIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTXVsdGlwbGVBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZLCBUZXN0U3ViamVjdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpICsgIjoiICsgdGhpcy5zdWJqZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTXVsdGlwbGVWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy5tdWx0aXBsZVZhbHVlQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIG11bHRpcGxlVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IGU7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsICNidWlsZFZhbHVlKCkgaW4KLQkgKiAjZW5nYWdlTm9uTnVsbFN1YmplY3QoKSwgd2hlbiB3ZSBuZWVkZWQgdG8gY2FsbAotCSAqIGl0IGluICNlbmdhZ2VTdWJqZWN0KCksIHNvIHRoZSBjYWNoZWQgdmFsdWUgd291bGQKLQkgKiBiZSByZWJ1aWx0IHdoZW4gdGhlIHRoaXMuc3ViamVjdCB3YXMgc2V0IHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQnVpbGRWYWx1ZVdpdGhOdWxsU3ViamVjdCgpIHsKLQkJVGVzdFN1YmplY3QgY3VzdG9tU3ViamVjdCA9IG5ldyBUZXN0U3ViamVjdCgiZnJlZCIsICJsYWJvcmVyIik7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBjdXN0b21TdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4oY3VzdG9tU3ViamVjdCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gY3VzdG9tQUEgPSB0aGlzLmJ1aWxkQ3VzdG9tQXNwZWN0QWRhcHRlcihjdXN0b21TdWJqZWN0SG9sZGVyKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjdXN0b21MaXN0ZW5lciA9IHRoaXMuYnVpbGRDdXN0b21WYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWN1c3RvbUFBLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBjdXN0b21MaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY3VzdG9tVmFsdWVFdmVudCA9IG51bGw7Ci0JCWN1c3RvbVN1YmplY3Quc2V0TmFtZSgid2lsbWEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWEiLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gbnVsbDsKLQkJY3VzdG9tU3ViamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGhpcyB3b3VsZCBmYWlsIC0gdGhlIHZhbHVlIHdvdWxkIGJlIG51bGwuLi4KLQkJYXNzZXJ0RXF1YWxzKCI8dW5uYW1lZD4iLCBjdXN0b21BQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCI8dW5uYW1lZD4iLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBhIGJ1ZzoKLQkgKiBJZiB0d28gbGlzdGVuZXJzIHdlcmUgYWRkZWQgdG8gYW4gYXNwZWN0IGFkYXB0ZXIsIG9uZSB3aXRoIGFuCi0JICogYXNwZWN0IG5hbWUgYW5kIG9uZSB3aXRob3V0LCB0aGUgYXNwZWN0IGFkYXB0ZXIgd291bGQgYWRkIGl0cwotCSAqICdzdWJqZWN0Q2hhbmdlTGlzdGVuZXInIHRvIGl0cyAnc3ViamVjdEhvbGRlcicgdHdpY2UuIEFzIGEgcmVzdWx0LAotCSAqIHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHRyaWdnZXIgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogaWYgdGhlIGJ1ZyBpcyBwcmVzZW50OyBvdGhlcndpc2UsIGl0IGNvbXBsZXRlcyBzaWxlbnRseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlTGlzdGVuZXIoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyAiPHVubmFtZWQ+IiA6IHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ3VzdG9tVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMuY3VzdG9tVmFsdWVDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgY3VzdG9tVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0IG1vZGVsICoqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb24iOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZGVzY3JpcHRpb247Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRJT05fUFJPUEVSVFksIG9sZCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjYxZWY0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZFZhbHVlSG9sZGVyOwotCi0JcHVibGljIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSGFzaEJhZzxTdHJpbmc+KCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JCi0Jc3RhdGljIGNsYXNzIFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWIwM2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZFZhbHVlSG9sZGVyOwotCi0JcHVibGljIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlMaXN0PFN0cmluZz4gYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hZGFwdGVyLmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkxKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlPYmplY3RbXSBhcnJheSA9IHRoaXMuYWRhcHRlci50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXJyYXlbMF0pOwotCQlhc3NlcnRFcXVhbHMoMSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTIoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSk7Ci0JCU9iamVjdFtdIGFycmF5ID0gdGhpcy5hZGFwdGVyLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlMaXN0PFN0cmluZz4gYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIGFkYXB0ZXJMaXN0KTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZExpc3QoKSwgYWRhcHRlckxpc3QpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZW1DaGFuZ2VkKCkgewotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0RWxlbWVudEF0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2NzhhNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMgCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JCi0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlck9iamVjdEhvbGRlcjsKLQkKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHdyYXBwZXJFdmVudDsKLQkKLQkKLQlwdWJsaWMgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIgPSBuZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLm9iamVjdEhvbGRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCWJvb2xlYW4gZXhjZXB0aW9uT2NjdXJyZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgewotCQkJZXhjZXB0aW9uT2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvbk9jY3VycmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gYnVpbGRXcmFwcGVyTGlzdGVuZXIoKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRXcmFwcGVyTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFdyYXBwZXJMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMud3JhcHBlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy53cmFwcGVyRXZlbnQsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLndyYXBwZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsIG51bGwpOwotCQl2ZXJpZnlFdmVudCh0aGlzLndyYXBwZXJFdmVudCwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLCAiYmFyIiwgbnVsbCk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy53cmFwcGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiZm9vIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMud3JhcHBlckV2ZW50LCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIsIG51bGwsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFdyYXBwZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLndyYXBwZXJFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI5YzhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNldENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgYWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IHJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DbGVhckV2ZW50IGNvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBzZXRBZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgc2V0UmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgc2V0Q2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBzZXRDaGFuZ2VkRXZlbnQ7Ci0KLQlwdWJsaWMgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iLCAiYmFyIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIiwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bGtDaGFuZ2UoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm94IiwgImZveCIsICJiYXQiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb3giLCAiYmF0Iik7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50czEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlFdmVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRTZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRXZlbnRzKCkgewotCQl0aGlzLmFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5yZW1vdmVFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0QWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldFJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRDbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldENoYW5nZWRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50cygpIHsKLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldEFkZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImJhciIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRSZW1vdmVFdmVudCk7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJiYXIiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEFkZEV2ZW50KTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0UmVtb3ZlRXZlbnQsIHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldEFkZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0Q2xlYXJlZEV2ZW50LCB0aGlzLnNldEhvbGRlcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJhdCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXQiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZveCIsICJmb3giLCAiYmF0IiwgImJhdCIsICJiYXQiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldENoYW5nZWRFdmVudCwgdGhpcy5zZXRIb2xkZXIsICJmb3giLCAiYmF0Iik7Ci0JCQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRBZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRSZW1vdmVFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFNldENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0UmVtb3ZlRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRDaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5KENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY3ZtLCBTdHJpbmcuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlCYWc8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKGN2bSk7Ci0JCUJhZzxTdHJpbmc+IGV4cGVjdGVkID0gQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdC4uLiBleHBlY3RlZEl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKGV4cGVjdGVkSXRlbXMpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhldmVudC5nZXRJdGVtcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0Li4uIGV4cGVjdGVkSXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcoZXhwZWN0ZWRJdGVtcyksIENvbGxlY3Rpb25Ub29scy5iYWcoZXZlbnQuZ2V0Q29sbGVjdGlvbigpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJhYzU1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYmFnSG9sZGVyOwotCUNvbGxlY3Rpb25FdmVudCBiYWdFdmVudDsKLQlTdHJpbmcgYmFnRXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHNldEhvbGRlcjsKLQlDb2xsZWN0aW9uRXZlbnQgc2V0RXZlbnQ7Ci0JU3RyaW5nIHNldEV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0KLQkKLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZ0hvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZFNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlCYWc8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkSXRlbXNUbyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU2V0PFN0cmluZz4gYnVpbGRTZXQoKSB7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW1zVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWMuYWRkKCJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkQWRkSXRlbXMoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkUmVtb3ZlSXRlbXMoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQmFnKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTZXQoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0SG9sZGVyQ29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJhZ0hvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlCYWc8U3RyaW5nPiBiYWcgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKGJhZy5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogaXRlbXMpIHsKLQkJCWlmIChzZXQuY29udGFpbnMoc3RyaW5nKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRBZGRJdGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLnNldEhvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlcygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuc2V0VmFsdWVzKHRoaXMuYnVpbGRBZGRJdGVtcygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuc2V0VmFsdWVzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCQl0aGlzLnNldEhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLnNldEhvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMSgpIHsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEJhZ0xpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0NoYW5nZSgpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlTZXRDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTIoKSB7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRCYWdMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlCYWdDaGFuZ2UoKTsKLQotCQl0aGlzLnNldEhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkU2V0TGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0NoYW5nZSgpIHsKLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJmb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImZvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChSRU1PVkUsICJqb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoUkVNT1ZFLCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQmFnKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQmFnKCksIENvbGxlY3Rpb25Ub29scy5iYWcoKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuYmFnRXZlbnQpLmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0Q2hhbmdlKCkgewotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChBREQsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsICJqb28iKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoUkVNT1ZFLCBudWxsKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZFNldCgpKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkU2V0KCkpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQmFnTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudFR5cGUgPSBBREQ7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0V2ZW50KFN0cmluZyBldmVudFR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGV2ZW50VHlwZSwgdGhpcy5iYWdFdmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWdIb2xkZXIsIHRoaXMuYmFnRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJhZ0V2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlCYWdFdmVudChTdHJpbmcgZXZlbnRUeXBlLCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KGV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmdldEJhZ0V2ZW50SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRCYWdFdmVudEl0ZW1zKCkgewotCQlpZiAodGhpcy5iYWdFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmJhZ0V2ZW50KS5nZXRJdGVtcygpOwotCQl9IGVsc2UgaWYgKHRoaXMuYmFnRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5iYWdFdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldEV2ZW50KFN0cmluZyBldmVudFR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGV2ZW50VHlwZSwgdGhpcy5zZXRFdmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zZXRIb2xkZXIsIHRoaXMuc2V0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNldEV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRFdmVudChTdHJpbmcgZXZlbnRUeXBlLCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeVNldEV2ZW50KGV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmdldFNldEV2ZW50SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRTZXRFdmVudEl0ZW1zKCkgewotCQlpZiAodGhpcy5zZXRFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLnNldEV2ZW50KS5nZXRJdGVtcygpOwotCQl9IGVsc2UgaWYgKHRoaXMuc2V0RXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5zZXRFdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDEyMmZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCUxpc3RFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCQotCXB1YmxpYyBTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRSZW1vdmVMaXN0KCkgewotLy8JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLS8vCQlyZXN1bHQuYWRkKCJmb28iKTsKLS8vCQlyZXN1bHQuYWRkKCJiYXIiKTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotLy8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKDEpKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigxKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzZXQuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRPYmplY3QoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDAsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDIsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPYmplY3QoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5jb250YWlucygiam9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJmb28iKTsKLQkJYy5hZGQoImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5jb250YWluc0FsbChjKSk7Ci0KLQkJYy5hZGQoImpvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnNBbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKSwgdGhpcy5saXN0SG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQWRkTGlzdCgpKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKS5oYXNoQ29kZSgpLCB0aGlzLmxpc3RIb2xkZXIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJiYXoiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImpvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJiYXoiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJqb28iKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSh0aGlzLmJ1aWxkTGlzdCgpLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0xpc3QuYWRkKCJqb28iKTsKLQkJbmV3TGlzdC5hZGQoImphciIpOwotCQluZXdMaXN0LmFkZCgiamF6Iik7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXdMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlMSgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UyKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsICJqb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsICJqb28iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCAiam9vIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldExpc3RWYWx1ZXModGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQ0hBTkdFKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJqb28iKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyBlKSB7Ci0JCWFzc2VydEVxdWFscyhlLCB0aGlzLmV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZSk7Ci0JCWlmIChlID09IEFERCkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9IGVsc2UgaWYgKGUgPT0gUkVNT1ZFKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhNjE3Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQkKLQlwdWJsaWMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCJmb28iLCAiYmFyIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCJiYXIiLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsICJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTBkMDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbjsKLQotCQotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbik7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCkgewotCQl0aGlzLnZlcmlmeUxpc3QoZXhwZWN0ZWQsIGFjdHVhbCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoZXhwZWN0ZWQpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNvcnRlZFNldCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LCBhY3R1YWxMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBhcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLnNldENvbXBhcmF0b3IobmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZyZWQiKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In0pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQljbGFzcyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzgxNWI5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGxpc3Q7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RNb2RlbDsKLQlwcml2YXRlIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+IHNvcnRlZExpc3RNb2RlbDsKLQotCQotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5saXN0TW9kZWwgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmxpc3QpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0KENvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhY3R1YWwpIHsKLQkJdGhpcy52ZXJpZnlMaXN0KGV4cGVjdGVkLCBhY3R1YWwsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0KENvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhY3R1YWwsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbXBhcmF0b3IpOwotCQlzb3J0ZWRTZXQuYWRkQWxsKGV4cGVjdGVkKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzb3J0ZWRTZXQpOwotCQlMaXN0PFN0cmluZz4gYWN0dWFsTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGFjdHVhbCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZExpc3QsIGFjdHVhbExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnNvcnRlZExpc3RNb2RlbC5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW0oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc29ydGVkTGlzdE1vZGVsKSwgc29ydGVkU3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0KDMsICJ0dHQiKTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0KDQsICJ4eHgiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdC5jb250YWlucygiamF6IikpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGFyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy5saXN0LnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCi0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLnNldENvbXBhcmF0b3IobmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHNvcnRlZFN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZyZWQiKTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMubGlzdE1vZGVsLnNldExpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9KSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnNvcnRlZExpc3RNb2RlbC5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JfQotCi0JY2xhc3MgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTMyZjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gQ09MTEVDVElPTiA9IGJ1aWxkQ29sbGVjdGlvbigpOwotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQotCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZENvbGxlY3Rpb24oKS5zaXplKCksIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3Y2JjNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBMSVNUID0gYnVpbGRMaXN0KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0KLQotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KExJU1QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBidWlsZExpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoaSksIHRoaXMubGlzdEhvbGRlci5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRMaXN0KCkuc2l6ZSgpLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODBjZjE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IE9CSkVDVF9IT0xERVIgPSBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCi0JCi0JcHVibGljIFN0YXRpY1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IE9CSkVDVF9IT0xERVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5vYmplY3RIb2xkZXIudG9TdHJpbmcoKS5pbmRleE9mKCJmb28iKSA+PSAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzY2U1OTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB0cmFuc2Zvcm1lZExpc3RIb2xkZXI7Ci0JTGlzdEV2ZW50IGV2ZW50OwotCVN0cmluZyBldmVudFR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFID0gInJlcGxhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCi0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0SG9sZGVyKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB0cmFuc2Zvcm0oTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihsaXN0LnNpemUoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGxpc3QpIHsKLQkJCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQobnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hZGQoc3RyaW5nLnRvVXBwZXJDYXNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQl9Ci0KLS8vCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUmVtb3ZlTGlzdCgpIHsKLS8vCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0vLwkJcmVzdWx0LmFkZCgiZm9vIik7Ci0vLwkJcmVzdWx0LmFkZCgiYmFyIik7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkUmVtb3ZlTGlzdCgpIHsKLS8vCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZFJlbW92ZUxpc3QoKSk7Ci0vLwl9Ci0vLwotCUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0pIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmcsIFN0cmluZz4obHZtKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtSXRlbShTdHJpbmcgcykgewotCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZXMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm1lZExpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJTGlzdDxTdHJpbmc+IHRyYW5zZm9ybWVkTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAodHJhbnNmb3JtZWRMaXN0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkpPTyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiSk9PIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDAsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbnkodGhpcy5idWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMiwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkJBUiIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSh0aGlzLmJ1aWxkTGlzdCgpLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiQkFSIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlR2VuZXJpYygpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZU5hbWVkKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgIkpPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJKT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJGT08iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkpPTyIpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KHR5cGUpOwotCQlpZiAodHlwZSA9PSBBREQpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IFJFTU9WRSkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJLyoKLQkJICogYWRkaW5nIGxpc3RlbmVycyB0byB0aGUgdHJhbnNmb3JtZWQgbGlzdCB3aWxsIGNhdXNlIGxpc3RlbmVycwotCQkgKiB0byBiZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0OwotCQkgKiBsaWtld2lzZSwgcmVtb3ZpbmcgbGlzdGVuZXJzIGZyb20gdGhlIHRyYW5zZm9ybWVkIGxpc3Qgd2lsbAotCQkgKiBjYXVzZSBsaXN0ZW5lcnMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QKLQkJICovCi0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIHNhbWUgc2V0IG9mIHRlc3RzIGFnYWluLCBidXQgYnkgcGFzc2luZyBhIFRyYW5zZm9ybWVyIHRvIHRoZSBhZGFwdGVyCi0JICogKGFzIG9wcG9zZWQgdG8gb3ZlcnJpZGluZyAjdHJhbnNmb3JtSXRlbShPYmplY3QpKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtZXJUZXN0cyBleHRlbmRzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgewotCQlwdWJsaWMgVHJhbnNmb3JtZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0pIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nLCBTdHJpbmc+KGx2bSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCQl9Ci0JCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogcy50b1VwcGVyQ2FzZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFhNmU0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nLCBTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgcmV2ZXJzZVRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsICJCQVIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBUiIsICJCQVoiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgIkZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBWiIsICJGT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZPTyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRm9vIiwgIkZPTyIpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgIkJBUiIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg1MWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyZWVBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmVlQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBUcmVlQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgTGlzdDxUZXN0Tm9kZT4+IGFhMTsKLQlwcml2YXRlIFRyZWVFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCQotCXB1YmxpYyBUcmVlQXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJVGVzdE5vZGUgcm9vdCwgbm9kZTsKLQotCQlyb290ID0gdGhpcy5zdWJqZWN0MS5nZXRSb290TmFtZU5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkTmFtZShyb290LCAibmFtZSAxLjEiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKG5vZGUsICJuYW1lIDEuMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZShub2RlLCAibmFtZSAxLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMiIpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUobm9kZSwgIm5hbWUgMS4yLjEiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkTmFtZShyb290LCAibmFtZSAxLjMiKTsKLQotCQlyb290ID0gdGhpcy5zdWJqZWN0MS5nZXRSb290RGVzY3JpcHRpb25Ob2RlKCk7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAxLjEiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMS4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMS4xLjIiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDEuMiIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMS4zIik7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQotCQlyb290ID0gdGhpcy5zdWJqZWN0Mi5nZXRSb290TmFtZU5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkTmFtZShyb290LCAibmFtZSAyLjEiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lKG5vZGUsICJuYW1lIDIuMS4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZShub2RlLCAibmFtZSAyLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMiIpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWUobm9kZSwgIm5hbWUgMi4yLjEiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkTmFtZShyb290LCAibmFtZSAyLjMiKTsKLQotCQlyb290ID0gdGhpcy5zdWJqZWN0Mi5nZXRSb290RGVzY3JpcHRpb25Ob2RlKCk7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAyLjEiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMi4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMi4xLjIiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDIuMiIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMi4zIik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgTGlzdDxUZXN0Tm9kZT4+IGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgTGlzdDxUZXN0Tm9kZT4+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpIHsKLQkJCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8TGlzdDxUZXN0Tm9kZT4+IG5vZGVzXygpIHsKLQkJCQlpZiAodGhpcy50cmVlTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVQYXRocygpOwotCQkJCX0KLQkJCQlpZiAodGhpcy50cmVlTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX1RSRUUpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvblBhdGhzKCk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLnRyZWVOYW1lc1swXSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKFRyZWVFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVTdHJ1Y3R1cmVDaGFuZ2UoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXModGhpcy5zdWJqZWN0MS5nZXRSb290TmFtZU5vZGUoKSwgImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuY29udGFpbnNOYW1lTm9kZSgiamFtIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuY29udGFpbnNOYW1lTm9kZSgiamF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlcygpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29udmVydFRvTmFtZXModGhpcy5zdWJqZWN0MS5uYW1lUGF0aHMoKSksIHRoaXMuY29udmVydFRvTmFtZXModGhpcy5hYTEubm9kZXMoKSkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbnZlcnRUb05hbWVzKEl0ZXJhdG9yPExpc3Q8VGVzdE5vZGU+PiBuYW1lUGF0aHMpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJd2hpbGUgKG5hbWVQYXRocy5oYXNOZXh0KCkpIHsKLQkJCUxpc3Q8VGVzdE5vZGU+IHBhdGggPSBuYW1lUGF0aHMubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKCdbJyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGguc2l6ZSgpOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGF0aC5nZXQoaSkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoaSA8IHBhdGguc2l6ZSgpIC0gMSkgewotCQkJCQlzYi5hcHBlbmQoJzonKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoJ10nKTsKLQkJCXJlc3VsdC5hZGQoc2IudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQl0aGlzLmFhMS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQkKLQljbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFRlc3ROb2RlIHJvb3ROYW1lTm9kZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfVFJFRSA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgVGVzdE5vZGUgcm9vdERlc2NyaXB0aW9uTm9kZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX1RSRUUgPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5yb290TmFtZU5vZGUgPSBuZXcgVGVzdE5vZGUoInJvb3QgbmFtZSIpOwotCQkJdGhpcy5yb290RGVzY3JpcHRpb25Ob2RlID0gbmV3IFRlc3ROb2RlKCJyb290IGRlc2NyaXB0aW9uIik7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFJvb3ROYW1lTm9kZSgpIHsKLQkJCXJldHVybiB0aGlzLnJvb3ROYW1lTm9kZTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IG5hbWVOb2RlcygpIHsKLQkJCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzLnJvb3ROYW1lTm9kZSkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gY2hpbGRyZW4oVGVzdE5vZGUgbmV4dCkgewotCQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPExpc3Q8VGVzdE5vZGU+PiBuYW1lUGF0aHMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGVzdE5vZGUsIExpc3Q8VGVzdE5vZGU+Pih0aGlzLm5hbWVOb2RlcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3Q8VGVzdE5vZGU+IHRyYW5zZm9ybShUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBhZGROYW1lKFRlc3ROb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCVRlc3ROb2RlIGNoaWxkID0gbmV3IFRlc3ROb2RlKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChOQU1FU19UUkVFLCBjaGlsZC5nZXRQYXRoKCkpOwotCQkJcmV0dXJuIGNoaWxkOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFR3b05hbWVzKFRlc3ROb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCXBhcmVudC5hZGRDaGlsZChuZXcgVGVzdE5vZGUobmFtZTEpKTsKLQkJCXBhcmVudC5hZGRDaGlsZChuZXcgVGVzdE5vZGUobmFtZTIpKTsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5BTUVTX1RSRUUsIHBhcmVudC5nZXRQYXRoKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVOb2RlKFRlc3ROb2RlIG5hbWVOb2RlKSB7Ci0JCQluYW1lTm9kZS5nZXRQYXJlbnQoKS5yZW1vdmVDaGlsZChuYW1lTm9kZSk7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChOQU1FU19UUkVFLCBuYW1lTm9kZS5nZXRQYXRoKCkpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTmFtZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVOb2RlKG5hbWUpICE9IG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIG5hbWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRlc3ROb2RlPiBzdHJlYW0gPSB0aGlzLm5hbWVOb2RlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUZXN0Tm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRUZXh0KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBnZXRSb290RGVzY3JpcHRpb25Ob2RlKCkgewotCQkJcmV0dXJuIHRoaXMucm9vdERlc2NyaXB0aW9uTm9kZTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGRlc2NyaXB0aW9uTm9kZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUZXN0Tm9kZT4odGhpcy5yb290RGVzY3JpcHRpb25Ob2RlKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbihUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8TGlzdDxUZXN0Tm9kZT4+IGRlc2NyaXB0aW9uUGF0aHMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGVzdE5vZGUsIExpc3Q8VGVzdE5vZGU+Pih0aGlzLmRlc2NyaXB0aW9uTm9kZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0PFRlc3ROb2RlPiB0cmFuc2Zvcm0oVGVzdE5vZGUgbmV4dCkgewotCQkJCQlyZXR1cm4gbmV4dC5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgYWRkRGVzY3JpcHRpb24oVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCVRlc3ROb2RlIGNoaWxkID0gbmV3IFRlc3ROb2RlKGRlc2NyaXB0aW9uKTsKLQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoREVTQ1JJUFRJT05TX1RSRUUsIGNoaWxkLmdldFBhdGgoKSk7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRpb25Ob2RlKFRlc3ROb2RlIGRlc2NyaXB0aW9uTm9kZSkgewotCQkJZGVzY3JpcHRpb25Ob2RlLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKGRlc2NyaXB0aW9uTm9kZSk7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChERVNDUklQVElPTlNfVFJFRSwgZGVzY3JpcHRpb25Ob2RlLmdldFBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNEZXNjcmlwdGlvbk5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VGVzdE5vZGU+IHN0cmVhbSA9IHRoaXMuZGVzY3JpcHRpb25Ob2RlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUZXN0Tm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRUZXh0KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQljbGFzcyBUZXN0Tm9kZSB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHRleHQ7Ci0JCXByaXZhdGUgVGVzdE5vZGUgcGFyZW50OwotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248VGVzdE5vZGU+IGNoaWxkcmVuOwotCQotCQlwdWJsaWMgVGVzdE5vZGUoU3RyaW5nIHRleHQpIHsKLQkJCXRoaXMudGV4dCA9IHRleHQ7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEhhc2hCYWc8VGVzdE5vZGU+KCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIHRoaXMudGV4dDsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRQYXJlbnQoVGVzdE5vZGUgcGFyZW50KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzLmNoaWxkcmVuKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChUZXN0Tm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRlc3ROb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JCX0KLQkJcHVibGljIExpc3Q8VGVzdE5vZGU+IGdldFBhdGgoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRBbnRpUGF0aCgpKTsKLQkJfQotCQlwcml2YXRlIEl0ZXJhdG9yPFRlc3ROb2RlPiBidWlsZEFudGlQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFRlc3ROb2RlIG5leHRMaW5rKFRlc3ROb2RlIGN1cnJlbnRMaW5rKSB7Ci0JCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0Tm9kZSgiICsgdGhpcy50ZXh0ICsgIikiOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTVlNzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0KLQlwdWJsaWMgVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanVuayA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5qdW5rSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPih0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyID0gbmV3IFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25BZGQoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uUmVtb3ZlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVtb3ZlU3R1ZmYoImZvbyIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwsIG51bGwpOwotCQl9Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCWJvb2xlYW4gZXZlbnRSZWNlaXZlZCgpIHsKLQkJCXJldHVybiB0aGlzLmV2ZW50UmVjZWl2ZWQ7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0NPTExFQ1RJT04gPSAic3R1ZmYiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQzYzI1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFZhbHVlTGlzdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVMaXN0QWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCQotCXB1YmxpYyBWYWx1ZUxpc3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVMaXN0QWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEFkZCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW92ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVtb3ZlU3R1ZmYoImZvbyIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlcGxhY2UoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnJlcGxhY2VTdHVmZigiZm9vIiwgImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwsIG51bGwpOwotCQl9Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCWJvb2xlYW4gZXZlbnRSZWNlaXZlZCgpIHsKLQkJCXJldHVybiB0aGlzLmV2ZW50UmVjZWl2ZWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3R1ZmY7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVGRl9MSVNUID0gInN0dWZmIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGFkZFN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0xJU1QpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0xJU1QpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlcGxhY2VTdHVmZihTdHJpbmcgb2xkU3R1ZmZJdGVtLCBTdHJpbmcgbmV3U3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnJlcGxhY2VJdGVtSW5MaXN0KG9sZFN0dWZmSXRlbSwgbmV3U3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9MSVNUKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5MTI0OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVQcm9wZXJ0eUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanVuayA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5qdW5rSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPih0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyID0gbmV3IFZhbHVlUHJvcGVydHlBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VQcm9wZXJ0eSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCWNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMDJlMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVTdGF0ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVTdGF0ZUFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZVN0YXRlQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanVuayA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5qdW5rSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPih0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyID0gbmV3IFZhbHVlU3RhdGVBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU3RhdGUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwsIG51bGwpOwotCQl9Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCWJvb2xlYW4gZXZlbnRSZWNlaXZlZCgpIHsKLQkJCXJldHVybiB0aGlzLmV2ZW50UmVjZWl2ZWQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2RhMDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YWFiOTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gbm9kZUhvbGRlcjsKLQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gcHJlZmVyZW5jZUFkYXB0ZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCWJvb2xlYW4gbGlzdGVuZXJSZW1vdmVkID0gZmFsc2U7Ci0JUHJlZmVyZW5jZUNoYW5nZUV2ZW50IHByZWZlcmVuY2VFdmVudDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAiZm9vIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMubm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQlQcmVmZXJlbmNlcyBhbm90aGVyTm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoImFub3RoZXIgdGVzdCBub2RlIik7Ci0JCWFub3RoZXJOb2RlLnB1dChLRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShhbm90aGVyTm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZWZlcmVuY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFuZFJlQWRkUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgcHJlZmVyZW5jZSBlbnRpcmVseS4uLgotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy8gLi4udGhlbiByZS1hZGQgaXQgd2l0aCB0aGUgc2FtZSBrZXkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyByZWJ1aWxkIHRoZSBhZGFwdGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JCVN0cmluZyBERUZBVUxUX1ZBTFVFID0gImRlZmF1bHQgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSwgREVGQVVMVF9WQUxVRSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlIGVudGlyZWx5Li4uCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgREVGQVVMVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIC4uLnRoZW4gcmUtYWRkIGl0IHdpdGggdGhlIHNhbWUga2V5Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChERUZBVUxUX1ZBTFVFLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSB0aGlzLmxpc3RlbmVyIHNvIHRoZSBhZGFwdGVyIG5vIGxvbmdlciBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQkvLyBubyB0aGlzLmV2ZW50IHNob3VsZCBoYXZlIGJlZW4gZmlyZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJLy8gLi4uYW5kIHRoZSBhZGFwdGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIGFkZCB0aGUgdGhpcy5saXN0ZW5lciBzbyB0aGUgYWRhcHRlciBzeW5jaHMKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2RlIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGludGVnZXIKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0KLQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDEyMyk7Ci0JCWludGVnZXJQcmVmZXJlbmNlQWRhcHRlciA9IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuZm9ySW50ZWdlcih0aGlzLnRlc3ROb2RlLCBLRVlfTkFNRSwgMCk7Ci0JCWludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMjMpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDI0Nik7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigxMjMpLCBuZXcgSW50ZWdlcigyNDYpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDI0NiksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigyNDYpLCBuZXcgSW50ZWdlcigwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAxMjMpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEyMykpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIzKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBzaXR1YXRpb24gd2hlcmUKLQkgKiAtIHdlIGFyZSBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgd2hlbiBpdCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgInJlcG9zaXRvcnkiCi0JICogLSB3ZSBnZXQgbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCSAqIC0gd2UgdHJ5IHRvIHJlbW92ZSBvdXIgdGhpcy5saXN0ZW5lcgotCSAqIC0gdGhlIG5vZGUgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSB0aGUgYWRhcHRlciBzaG91bGQgaGFuZGxlIGl0IE9LLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHRoaXMudGVzdE5vZGUucGFyZW50KCk7Ci0JCXBhcmVudC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXRoaXMudGVzdE5vZGUuZmx1c2goKTsJCS8vIHRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgZm9yIHRoZSB0aGlzLmV2ZW50IHRvIHRyaWdnZXIuLi4KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdGVuZXJSZW1vdmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hpbGRBZGRlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hpbGRSZW1vdmVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0Q2hpbGQoKSA9PSBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50ZXN0Tm9kZSkgewotCQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXIpOwotCQkJCQkvLyB0aGlzIGxpbmUgb2YgY29kZSB3aWxsIG5vdCBleGVjdXRlIGlmIHRoZSBsaW5lIGFib3ZlIHRyaWdnZXJzIGFuIGV4Y2VwdGlvbgotCQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lclJlbW92ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2FtZVZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQkJdGhpcy50ZXN0Tm9kZS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQkvLyBub3cgc2V0IHRvICpzYW1lKiB2YWx1ZSAtIG5vdGhpbmcgc2hvdWxkIGhhcHBlbi4uLgotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2FtZVZhbHVlRm9yY2VQYXNzVGhyb3VnaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBBbHdheXNVcGRhdGVQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCXRoaXMudGVzdE5vZGUuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJLy8gbm93IHNldCB0byAqc2FtZSogdmFsdWUgLSBvbmx5IG9uZSB0aGlzLmV2ZW50IHNob3VsZCBmaXJlCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBldnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE1vZGVsIHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcmVmZXJlbmNlRXZlbnQoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcmVmZXJlbmNlRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0Tm9kZSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoS0VZX05BTUUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSGFzQW55UHJlZkxpc3RlbmVycyhQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10gcHJlZkxpc3RlbmVycyA9IChQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG5vZGUsICJwcmVmTGlzdGVuZXJzIik7Ci0JCXJldHVybiBwcmVmTGlzdGVuZXJzLmxlbmd0aCA+IDA7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBhZGFwdGVyIHRvIHRlc3Qgb3V0IGFsd2F5cyBwYXNzaW5nIHRocm91Z2ggdGhlIG5ldyB2YWx1ZQotCSAqIHRvIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBleHRlbmRzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gewotCi0JCUFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSkgewotCQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIsIGtleSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2V0UHJlZmVyZW5jZShPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2FmNDYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFByZWZlcmVuY2VzVGVzdENhc2UgewotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZFZhbHVlczsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBub2RlSG9sZGVyOwotCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBwcmVmZXJlbmNlc0FkYXB0ZXI7Ci0JQ29sbGVjdGlvbkV2ZW50IGV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaXRlbUxpc3RlbmVyOwotCWJvb2xlYW4gbGlzdGVuZXJSZW1vdmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzEgPSAiZm9vIDEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8yID0gImZvbyAyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMyA9ICJmb28gMyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8xID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAxIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzIgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMyA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMyI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8xLCBTVFJJTkdfVkFMVUVfMSk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzIsIFNUUklOR19WQUxVRV8yKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPih0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlcik7Ci0JCXRoaXMubGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuaXRlbUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1MaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgbG9nRXZlbnQoQ29sbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUVfMSA9ICJhbm90aGVyIGtleSAxIjsKLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUVfMiA9ICJhbm90aGVyIGtleSAyIjsKLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUVfMyA9ICJhbm90aGVyIGtleSAzIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzEgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMSI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8yID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDIiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMyA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAzIjsKLQkJUHJlZmVyZW5jZXMgYW5vdGhlck5vZGUgPSB0aGlzLmNsYXNzTm9kZS5ub2RlKCJhbm90aGVyIHRlc3Qgbm9kZSIpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzEsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzEpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzEsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzEpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8yLCBBTk9USEVSX1NUUklOR19WQUxVRV8yKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8yLCBBTk9USEVSX1NUUklOR19WQUxVRV8yKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMywgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMyk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMywgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMyk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKGFub3RoZXJOb2RlKTsKLQkJLy8gY29sbGVjdGlvbkNoYW5nZWQgZG9lcyBub3QgcGFzcyBhbnkgaXRlbXMgaW4gdGhlIHRoaXMuZXZlbnQKLQkJdGhpcy52ZXJpZnlFdmVudCgpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5jbGVhcigpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8xLCBTVFJJTkdfVkFMVUVfMSk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIFNUUklOR19WQUxVRV8yKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfS0VZX05BTUUgPSAiYW5vdGhlciBrZXkiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUiOwotCQl0aGlzLnRlc3ROb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWRJdGVtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlleHBlY3RlZEl0ZW1zLnB1dChBTk9USEVSX0tFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZXhwZWN0ZWRJdGVtcyk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FXzIpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByZWZlcmVuY2VzQWRhcHRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXNTaXplKCkpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJU3RyaW5nIGtleSA9ICgoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KSAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSkuZ2V0S2V5KCk7Ci0JCWFzc2VydEVxdWFscyhLRVlfTkFNRV8yLCBrZXkpOwotCi0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucmVtb3ZlKEtFWV9OQU1FXzIpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIERJRkZFUkVOVCA9ICJzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQiOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8yLCBESUZGRVJFTlQpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMiwgRElGRkVSRU5UKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5Tm9kZSh0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgc2l0dWF0aW9uIHdoZXJlCi0JICogLSB3ZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSBub2RlIHdoZW4gaXQgZ2V0cyByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2VzICJyZXBvc2l0b3J5IgotCSAqIC0gd2UgZ2V0IG5vdGlmaWNhdGlvbiB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQKLQkgKiAtIHdlIHRyeSB0byByZW1vdmUgb3VyIHRoaXMubGlzdGVuZXIKLQkgKiAtIHRoZSBub2RlIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gdGhlIGFkYXB0ZXIgc2hvdWxkIGhhbmRsZSBpdCBPSy4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSB0aGlzLnRlc3ROb2RlLnBhcmVudCgpOwotCQlwYXJlbnQuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlTm9kZSgpOwotCQl0aGlzLnRlc3ROb2RlLmZsdXNoKCk7CQkvLyB0aGlzIHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciB0aGUgdGhpcy5ldmVudCB0byB0cmlnZ2VyLi4uCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RlbmVyUmVtb3ZlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hpbGRBZGRlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hpbGRSZW1vdmVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0Q2hpbGQoKSA9PSBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy50ZXN0Tm9kZSkgewotCQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXIpOwotCQkJCQkvLyB0aGlzIGxpbmUgb2YgY29kZSB3aWxsIG5vdCBleGVjdXRlIGlmIHRoZSBsaW5lIGFib3ZlIHRyaWdnZXJzIGFuIGV4Y2VwdGlvbgotCQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lclJlbW92ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBsb2dFdmVudChDb2xsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE1hcDxTdHJpbmcsIFN0cmluZz4gaXRlbXMpIHsKLQkJdGhpcy52ZXJpZnlFdmVudCgpOwotCQlhc3NlcnRFcXVhbHMoaXRlbXMuc2l6ZSgpLCAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXNTaXplKCkpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+PiBldmVudEl0ZW1zID0gKEl0ZXJhYmxlPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4pICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpOwotCQl0aGlzLnZlcmlmeUl0ZW1zKGl0ZW1zLCBldmVudEl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByZWZlcmVuY2VzQWRhcHRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGtleXMgPSBub2RlLmtleXMoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuc2l6ZSgpLCBrZXlzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuZ2V0KGtleXNbaV0pLCBub2RlLmdldChrZXlzW2ldLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QWRhcHRlcihQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY3ZtKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV4cGVjdGVkVmFsdWVzLnNpemUoKSwgY3ZtLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5SXRlbXModGhpcy5leHBlY3RlZFZhbHVlcywgY3ZtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SXRlbXMoTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZCwgSXRlcmFibGU8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+PiBhY3R1YWwpIHsKLQkJZm9yIChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbW9kZWwgOiBhY3R1YWwpIHsKLQkJCW1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLml0ZW1MaXN0ZW5lcik7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0KG1vZGVsLmdldEtleSgpKSwgbW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCQltb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pdGVtTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSBwcmVmTGlzdGVuZXJzID0gKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobm9kZSwgInByZWZMaXN0ZW5lcnMiKTsKLQkJcmV0dXJuIHByZWZMaXN0ZW5lcnMubGVuZ3RoID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNGMzMDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5BYnN0cmFjdFByZWZlcmVuY2VzOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLS8qKgotICogc2V0IHVwIGFuZCB0ZWFyIGRvd24gYSB0ZXN0IG5vZGUgZm9yIGFueSBzdWJjbGFzcyB0aGF0Ci0gKiBuZWVkcyB0byB0ZXN0IHByZWZlcmVuY2VzLXJlbGF0ZWQgc3R1ZmYKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VzVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGNsYXNzTm9kZTsKLQlwdWJsaWMgUHJlZmVyZW5jZXMgdGVzdE5vZGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OT0RFX05BTUUgPSAidGVzdCBub2RlIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlc1Rlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVByZWZlcmVuY2VzIHBhY2thZ2VOb2RlID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKHRoaXMuZ2V0Q2xhc3MoKSk7Ci0JCXRoaXMuY2xhc3NOb2RlID0gcGFja2FnZU5vZGUubm9kZShDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJLy8gY2xlYW4gb3V0IGFueSBsZWZ0b3ZlciBjcmFwLi4uCi0JCWlmICgodGhpcy5jbGFzc05vZGUua2V5cygpLmxlbmd0aCA+IDApIHx8ICh0aGlzLmNsYXNzTm9kZS5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoID4gMCkpIHsKLQkJCXRoaXMuY2xhc3NOb2RlLnJlbW92ZU5vZGUoKTsKLQkJCS8vIC4uLmFuZCByZS1jcmVhdGUgdGhlIG5vZGUKLQkJCXRoaXMuY2xhc3NOb2RlID0gcGFja2FnZU5vZGUubm9kZShDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJfQotCQl0aGlzLnRlc3ROb2RlID0gdGhpcy5jbGFzc05vZGUubm9kZShURVNUX05PREVfTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gd2FpdCBmb3IgYWxsIHRoZSBldmVudHMgdG8gYmUgZGVsaXZlcmVkIGJlZm9yZSB0ZWFyaW5nIGRvd24KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IHRoaXMuY2xhc3NOb2RlLnBhcmVudCgpOwotCQl0aGlzLmNsYXNzTm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXdoaWxlICh0aGlzLm5vZGVJc1Zlc3RpZ2lhbChub2RlKSkgewotCQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gbm9kZS5wYXJlbnQoKTsKLQkJCW5vZGUucmVtb3ZlTm9kZSgpOwotCQkJbm9kZSA9IHBhcmVudDsKLQkJfQotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vZGVJc1Zlc3RpZ2lhbChQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwpCi0JCQkmJiAobm9kZS5rZXlzKCkubGVuZ3RoID09IDApCi0JCQkmJiAobm9kZS5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoID09IDApCi0JCQkmJiAobm9kZSAhPSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKSB7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoICEgdGhpcy5wcmVmZXJlbmNlc0V2ZW50UXVldWUoKS5pc0VtcHR5KCkpIHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCX0KLQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PEV2ZW50T2JqZWN0PiBwcmVmZXJlbmNlc0V2ZW50UXVldWUoKSB7Ci0JCXJldHVybiAoTGlzdDxFdmVudE9iamVjdD4pIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZShBYnN0cmFjdFByZWZlcmVuY2VzLmNsYXNzLCAiZXZlbnRRdWV1ZSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMjQ1OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnV0dG9uTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIgPSBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5ib29sZWFuSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydFRydWUodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRUcnVlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbG9jYWxCb29sZWFuSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPikgdGhpcy5ib29sZWFuSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbEJvb2xlYW5Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbEJvb2xlYW5Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoID09IDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiYzM3My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZmxhZzFCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGZsYWcyQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBub3RGbGFnMkJ1dHRvbk1vZGVsOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKHRydWUsIHRydWUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcxQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMUhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMkhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5ub3RGbGFnMkhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENoZWNrQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzFDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkTm90RmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZFVuYXR0YWNoZWRDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5nZXRNb2RlbCgpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSXRlbUxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHN0YXRlIGNoYW5nZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRGbGlwRmxhZzFCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJmbGlwIGZsYWcgMSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzkxMTFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLkNvb3JkaW5hdGVkTGlzdDsKLQotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obGlzdEhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDb21ib0JveE1vZGVsIGNvbWJvQm94TW9kZWwgPSBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIobGlzdEhvbGRlciwgc2VsZWN0aW9uSG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8RGlzcGxheWFibGU+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8RGlzcGxheWFibGU+KGNvbWJvQm94TW9kZWwpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0KLQkJY29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCXNlbGVjdGlvbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0aW9uSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQkvLyBkbyBub3RoaW5nLi4uCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzID0gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNMaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNMaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RGlzcGxheWFibGU+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PERpc3BsYXlhYmxlPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8RGlzcGxheWFibGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PERpc3BsYXlhYmxlPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPERpc3BsYXlhYmxlPiBjKSB7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiZm9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJhciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiam9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImphciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXoiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNmU4ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5GaWx0ZXJpbmdMaXN0QnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5MaXN0Q2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgY29tYm8tYm94ZXMuCi0gKiAKLSAqIERlZmF1bHRMb25nTGlzdEJyb3dzZXJEaWFsb2dVSVRlc3Qgc3ViY2xhc3NlcyB0aGlzIGNsYXNzOyBzbyBiZQotICogY2FyZWZ1bCB3aGVuIG1ha2luZyBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJvdGVjdGVkIEpGcmFtZSB3aW5kb3c7Ci0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBjb2xvckxpc3RIb2xkZXI7Ci0JcHJvdGVjdGVkIENvbWJvQm94TW9kZWwgY29sb3JDb21ib0JveE1vZGVsOwotCXByaXZhdGUgaW50IG5leHRDb2xvck51bWJlciA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldENyb3NzUGxhdGZvcm1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsJLy8gTWV0YWwgTEFGCi0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGNvbS5zdW4uamF2YS5zd2luZy5wbGFmLndpbmRvd3MuV2luZG93c0xvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGNvbS5zdW4uamF2YS5zd2luZy5wbGFmLm1vdGlmLk1vdGlmTG9va0FuZEZlZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwob3JhY2xlLmJhbGkuZXd0Lm9sYWYuT3JhY2xlTG9va0FuZEZlZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSB0aGlzLmJ1aWxkVGVzdE1vZGVsKCk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5jb2xvckhvbGRlciA9IHRoaXMuYnVpbGRDb2xvckhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuY29sb3JMaXN0SG9sZGVyID0gdGhpcy5idWlsZENvbG9yTGlzdEhvbGRlcigpOwotCQl0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCA9IHRoaXMuYnVpbGRDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmNvbG9yTGlzdEhvbGRlciwgdGhpcy5jb2xvckhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZENvbG9ySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgT2JqZWN0Pih2bSwgVGVzdE1vZGVsLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbCgpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KFRlc3RNb2RlbC52YWxpZENvbG9ycygpKTsKLS8vCQlyZXR1cm4gbmV3IEFic3RyYWN0UmVhZE9ubHlMaXN0VmFsdWVNb2RlbCgpIHsKLS8vCQkJcHVibGljIE9iamVjdCB2YWx1ZSgpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3IoVGVzdE1vZGVsLlZBTElEX0NPTE9SUyk7Ci0vLwkJCX0KLS8vCQkJcHVibGljIGludCBzaXplKCkgewotLy8JCQkJcmV0dXJuIFRlc3RNb2RlbC5WQUxJRF9DT0xPUlMubGVuZ3RoOwotLy8JCQl9Ci0vLwkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB1aUNvbG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29sb3JMaXN0SG9sZGVyOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZENvbWJvQm94TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyLCBzZWxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQl0aGlzLndpbmRvdyA9IG5ldyBKRnJhbWUoQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpcy5nZXRDbGFzcygpKSk7Ci0JCXRoaXMud2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXRoaXMud2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJdGhpcy53aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXRoaXMud2luZG93LnNldExvY2F0aW9uKDMwMCwgMzAwKTsKLQkJdGhpcy53aW5kb3cuc2V0U2l6ZSg0MDAsIDE1MCk7Ci0JCXRoaXMud2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94UGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIEpQYW5lbCBidWlsZENvbWJvQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94KCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94KCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZExpc3RDaG9vc2VyMSgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRMaXN0Q2hvb3NlcjIoKSk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpDb21ib0JveCBidWlsZENvbWJvQm94KCkgewotCQlKQ29tYm9Cb3ggY29tYm9Cb3ggPSBuZXcgSkNvbWJvQm94KHRoaXMuY29sb3JDb21ib0JveE1vZGVsKTsKLQkJY29tYm9Cb3guc2V0UmVuZGVyZXIodGhpcy5idWlsZENvbWJvQm94UmVuZGVyZXIoKSk7Ci0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZENvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmJ1aWxkVGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hvb3NlciBidWlsZExpc3RDaG9vc2VyMSgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RDaG9vc2VyMSh0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hvb3NlciBidWlsZExpc3RDaG9vc2VyMigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RDaG9vc2VyMih0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDIsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRUZW5CdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZVRlbkJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0IGNvbG9yIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldENvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0Q29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldENvbG9yKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9DT0xPUik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjbGVhciBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXN0b3JlIG1vZGVsIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcmludCBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAyMCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZFRlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRUZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRUZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCAyMCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkVGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkVGVuKCkgewotCQlmb3IgKGludCBpID0gdGhpcy5uZXh0Q29sb3JOdW1iZXI7IGkgPCB0aGlzLm5leHRDb2xvck51bWJlciArIDIwOyBpKyspIHsKLQkJCXRoaXMuY29sb3JMaXN0SG9sZGVyLmFkZCh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCksICJjb2xvciIgKyBpKTsKLQkJfQotCQl0aGlzLm5leHRDb2xvck51bWJlciArPSAyMDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAyMCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZVRlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVUZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVUZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSAyMCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlVGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVtb3ZlVGVuKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJCWlmICh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCkgPiAwKSB7Ci0JCQkJdGhpcy5jb2xvckxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuY29sb3JMaXN0SG9sZGVyLnNpemUoKSAtIDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBjb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBTkdFID0gIm9yYW5nZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRUxMT1cgPSAieWVsbG93IjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRJR08gPSAiaW5kaWdvIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJT0xFVCA9ICJ2aW9sZXQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xPUiA9IFJFRDsKLQkJCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbGlkQ29sb3JzOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1ZBTElEX0NPTE9SUyA9IHsKLQkJCQlSRUQsCi0JCQkJT1JBTkdFLAotCQkJCVlFTExPVywKLQkJCQlHUkVFTiwKLQkJCQlCTFVFLAotCQkJCUlORElHTywKLQkJCQlWSU9MRVQKLQkJCX07Ci0JCi0JCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbGlkQ29sb3JzKCkgewotCQkJaWYgKHZhbGlkQ29sb3JzID09IG51bGwpIHsKLQkJCQl2YWxpZENvbG9ycyA9IGJ1aWxkRGVmYXVsdFZhbGlkQ29sb3JzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRDb2xvcnM7Ci0JCX0KLQkJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gYnVpbGREZWZhdWx0VmFsaWRDb2xvcnMoKSB7Ci0JCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgREVGQVVMVF9WQUxJRF9DT0xPUlMpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwdWJsaWMgVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBjb2xvcikgewotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY2hlY2tDb2xvcihjb2xvcik7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5jb2xvcjsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xPUl9QUk9QRVJUWSwgb2xkLCBjb2xvcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hlY2tDb2xvcihTdHJpbmcgYykgewotCQkJaWYgKCAhIHZhbGlkQ29sb3JzKCkuY29udGFpbnMoYykpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGMpOwotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuY29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0Q2hvb3NlcjEgZXh0ZW5kcyBMaXN0Q2hvb3NlciB7Ci0JCXB1YmxpYyBMb2NhbExpc3RDaG9vc2VyMShDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCQlzdXBlcihtb2RlbCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0Q2hvb3NlcjIgZXh0ZW5kcyBMaXN0Q2hvb3NlciB7Ci0JCXB1YmxpYyBMb2NhbExpc3RDaG9vc2VyMihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCQlzdXBlcihtb2RlbCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0QnJvd3NlciBidWlsZEJyb3dzZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0xpc3RCcm93c2VyPFN0cmluZz4oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzVmYzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZUxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIgZXh0ZW5kcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBkaWZmZXJlbnQgbW9kZWwgdGhhdCBhbGxvd3MgdGhlIGNvbG9yIHRvIGJlIHNldCB0byBudWxsCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwyKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbnVsbCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB1aUNvbG9yTGlzdEhvbGRlcigpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gcHJlcGVuZCB0aGUgd3JhcHBlZCBsaXN0IHdpdGggYSBudWxsIGl0ZW0KLQkJcmV0dXJuIG5ldyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHN1cGVyLnVpQ29sb3JMaXN0SG9sZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlcnQgbnVsbCB0byBzb21lIHRleHQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZENvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICI8bm9uZSBzZWxlY3RlZD4iIDogc3VwZXIuYnVpbGRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsMiBleHRlbmRzIFRlc3RNb2RlbCB7Ci0JCS8qKgotCQkgKiBudWxsIGlzIE9LIGhlcmUKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjaGVja0NvbG9yKFN0cmluZyBjb2xvcikgewotCQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzdXBlci5jaGVja0NvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyNTVlNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBEYXRlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKCgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSA9PSA3Nzc3NzcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCURhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCB0b2RheSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKHRvZGF5LCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ3MzYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQuRXZlbnRUeXBlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyOwotCURvY3VtZW50IGRvY3VtZW50QWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdHJpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oIjAxMjM0NTY3ODkiKTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIgPSBuZXcgRG9jdW1lbnRBZGFwdGVyKHRoaXMuc3RyaW5nSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuUkVNT1ZFLCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgcmVtb3ZhbCBvZiAiMjM0NTYiCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscyg1LCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLnJlbW92ZSgyLCA1KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoIjAxNzg5IiwgdGhpcy5zdHJpbmdIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuSU5TRVJULCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgaW5zZXJ0IG9mICJ4eHh4eHgiCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscyg1LCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmluc2VydFN0cmluZygyLCAieHh4eHgiLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoIjAxeHh4eHgyMzQ1Njc4OSIsIHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuSU5TRVJULCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgaW5zZXJ0IG9mICJmb28iCi0JCQkJYXNzZXJ0RXF1YWxzKDAsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscygzLCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuUkVNT1ZFLCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgcmVtb3ZhbCBvZiAiMDEyMzQ1Njc4OSIKLQkJCQlhc3NlcnRFcXVhbHMoMCwgZS5nZXRPZmZzZXQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDEwLCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OSIsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldFRleHQoMCwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0TGVuZ3RoKCkpKTsKLQkJdGhpcy5zdHJpbmdIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0VGV4dCgwLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbG9jYWxTdHJpbmdIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuc3RyaW5nSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0KLQkJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0RG9jdW1lbnRMaXN0ZW5lcigpOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5hZGREb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCi0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLnJlbW92ZURvY3VtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IENsYXNzVG9vbHMuZmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0RG9jdW1lbnRMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGRvY3VtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gQ2xhc3NUb29scy5maWVsZFZhbHVlKGRvY3VtZW50LCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXREb2N1bWVudExpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi1wcml2YXRlIGNsYXNzIFRlc3REb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgRG9jdW1lbnRMaXN0ZW5lciB7Ci0JVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YjQzMzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkFic3RyYWN0RG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUGxhaW5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGVudHJ5IGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUUgPSAiU2Nvb2J5IERvbyI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUhvbGRlcjsKLQlwcml2YXRlIERvY3VtZW50IG5hbWVEb2N1bWVudDsKLQlwcml2YXRlIERvY3VtZW50IHVwcGVyQ2FzZU5hbWVEb2N1bWVudDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50QWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKERFRkFVTFRfTkFNRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5uYW1lSG9sZGVyID0gdGhpcy5idWlsZE5hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5hbWVEb2N1bWVudCA9IHRoaXMuYnVpbGROYW1lRG9jdW1lbnQodGhpcy5uYW1lSG9sZGVyKTsKLQkJdGhpcy51cHBlckNhc2VOYW1lRG9jdW1lbnQgPSB0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZURvY3VtZW50KHRoaXMubmFtZUhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KHZtLCBUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGROYW1lRG9jdW1lbnQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIoc3RyaW5nSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGJ1aWxkVXBwZXJDYXNlTmFtZURvY3VtZW50KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHN0cmluZ0hvbGRlciwgdGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudERlbGVnYXRlKCkpOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REb2N1bWVudCBidWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudERlbGVnYXRlKCkgewotCQlyZXR1cm4gbmV3IFBsYWluRG9jdW1lbnQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFN0cmluZyhpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nLCBBdHRyaWJ1dGVTZXQgYSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljaGFyW10gdXBwZXIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVwcGVyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXVwcGVyW2ldID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHVwcGVyW2ldKTsKLQkJCQl9Ci0JCQkJc3VwZXIuaW5zZXJ0U3RyaW5nKG9mZnNldCwgbmV3IFN0cmluZyh1cHBlciksIGEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGV4dEZpZWxkUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUZXh0RmllbGRQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5hbWVUZXh0RmllbGQoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lVGV4dEZpZWxkKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGROYW1lVGV4dEZpZWxkKCkgewotCQlyZXR1cm4gbmV3IEpUZXh0RmllbGQodGhpcy5uYW1lRG9jdW1lbnQsIG51bGwsIDApOwotCX0KLQotCXByaXZhdGUgSlRleHRGaWVsZCBidWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZCgpIHsKLQkJSlRleHRGaWVsZCBuYW1lVGV4dEZpZWxkID0gdGhpcy5idWlsZE5hbWVUZXh0RmllbGQoKTsKLQkJbmFtZVRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiBuYW1lVGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgSlRleHRGaWVsZCBidWlsZFVwcGVyQ2FzZU5hbWVUZXh0RmllbGQoKSB7Ci0JCXJldHVybiBuZXcgSlRleHRGaWVsZCh0aGlzLnVwcGVyQ2FzZU5hbWVEb2N1bWVudCwgbnVsbCwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXROYW1lQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXROYW1lQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0TmFtZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0TmFtZUFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgbmFtZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLnJlc2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0TmFtZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0TmFtZShERUZBVUxUX05BTUUpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXROYW1lKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuZ2V0TmFtZSgpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMWJkMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERvY3VtZW50QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2NTMyNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLkNvb3JkaW5hdGVkTGlzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyIGJ1aWxkTGlzdE1vZGVsKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobGlzdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkTGlzdE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChjb2xsZWN0aW9uSG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgidG9tIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJkaWNrIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJoYXJyeSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXIiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImhhcnJ5Iik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsICJ0b20iKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgImRpY2siKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgImhhcnJ5Iik7Ci0JCWxpc3RIb2xkZXIuYWRkKDksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDkpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1vZGVsKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIxID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsQWRhcHRlciBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIxKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyMiA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyMigpOwotCQlsaXN0TW9kZWwuc2V0TW9kZWwobGlzdEhvbGRlcjIpOwotCQlhc3NlcnRFcXVhbHMoMywgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCWxpc3RNb2RlbC5zZXRNb2RlbChuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIxLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIyLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RNb2RlbCBsaXN0TW9kZWwsIExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0TW9kZWwuZ2V0U2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdE1vZGVsLmdldEVsZW1lbnRBdChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJLy8gc29ydCB3aXRoIHJldmVyc2Ugb3JkZXIKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvblNvcnQoQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoInRvbSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiZGljayIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXIiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImhhcnJ5Iik7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RTb3J0KENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPihsaXN0SG9sZGVyLCBjb21wYXJhdG9yKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDAsICJ0b20iKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgImRpY2siKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgImhhcnJ5Iik7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RNb2RlbCBsaXN0TW9kZWwsIExpc3Q8U3RyaW5nPiBsaXN0LCBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQoKFN0cmluZykgbGlzdE1vZGVsLmdldEVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQotCQlsaXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0TW9kZWwuZ2V0U2l6ZSgpKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCi0JCWxpc3RNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50QXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbGlzdE1vZGVsLmdldEVsZW1lbnRBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc3luY2hMaXN0LmdldCgwKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzID0gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNMaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNMaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCQljLmFkZCgiam9vIik7Ci0JCWMuYWRkKCJqYXIiKTsKLQkJYy5hZGQoImpheiIpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uMihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInRvbSIpOwotCQljLmFkZCgiZGljayIpOwotCQljLmFkZCgiaGFycnkiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OGVlNDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5UZXh0RmllbGQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHZhcmlvdXMgcGVybXV0YXRpb25zIG9mIHRoZSBMaXN0TW9kZWxBZGFwdGVyCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0RmllbGQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgTGlzdE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+KG5ldyBUYXNrTGlzdCgpKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgwLCAxKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZERpc3BsYXlhYmxlVGFza0xpc3RQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoInByaW1pdGl2ZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgiZGlzcGxheWFibGUgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tPYmplY3RDb21wYXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZExpc3RQYW5lbChTdHJpbmcgbGFiZWwsIExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJSlBhbmVsIGxpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJSkxhYmVsIGxpc3RMYWJlbCA9IG5ldyBKTGFiZWwoIiAgIiArIGxhYmVsKTsKLQkJbGlzdFBhbmVsLmFkZChsaXN0TGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJSkxpc3QgbGlzdEJveCA9IG5ldyBKTGlzdCgpOwotCQlsaXN0Qm94LnNldE1vZGVsKGxpc3RNb2RlbCk7Ci0JCWxpc3RCb3guc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCWxpc3RMYWJlbC5zZXRMYWJlbEZvcihsaXN0Qm94KTsKLQkJbGlzdFBhbmVsLmFkZChuZXcgSlNjcm9sbFBhbmUobGlzdEJveCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlyZXR1cm4gbGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrT2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyh0bzEuZGlzcGxheVN0cmluZygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4oVGFza0xpc3QuVEFTS19OQU1FU19MSVNULCB0aGlzLnRhc2tMaXN0KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KFRhc2tMaXN0LlRBU0tTX0xJU1QsIHRoaXMudGFza0xpc3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbW92ZVRhc2tQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkVGFza1RleHRGaWVsZCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGFkZFJlbW92ZVRhc2tQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQlwcml2YXRlIFRhc2tMaXN0IHRhc2tMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrTGlzdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLmdldFRhc2soKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdCgpLmFkZFRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy5nZXRUYXNrKCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QoKS5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0KCkuY2xlYXJUYXNrcygpOwotCX0KLQotCXByaXZhdGUgVGV4dEZpZWxkIGJ1aWxkVGFza1RleHRGaWVsZCgpIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHVibGljIGNsYXNzIFRhc2tMaXN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHRhc2tOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcml2YXRlIExpc3Q8VGFzaz4gdGFza09iamVjdHMgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tPYmplY3RzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5zaXplKCk7Ci0JCQl0aGlzLnRhc2tOYW1lcy5hZGQoaW5kZXgsIHRhc2tOYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChUQVNLX05BTUVTX0xJU1QsIGluZGV4LCB0YXNrTmFtZSk7Ci0JCi0JCQlUYXNrIHRhc2tPYmplY3QgPSBuZXcgVGFzayh0YXNrTmFtZSk7Ci0JCQl0aGlzLnRhc2tPYmplY3RzLmFkZChpbmRleCwgdGFza09iamVjdCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVEFTS1NfTElTVCwgaW5kZXgsIHRhc2tPYmplY3QpOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJT2JqZWN0IHJlbW92ZWRUYXNrID0gdGhpcy50YXNrTmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUQVNLX05BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFzayk7Ci0JCQkJLy8gYXNzdW1lIHRoZSBpbmRleGVzIG1hdGNoLi4uCi0JCQkJT2JqZWN0IHJlbW92ZWRUYXNrT2JqZWN0ID0gdGhpcy50YXNrT2JqZWN0cy5yZW1vdmUoaW5kZXgpOwotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFRBU0tTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFza09iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMudGFza05hbWVzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChUQVNLX05BTUVTX0xJU1QsIHRoaXMudGFza05hbWVzKTsKLQkJCXRoaXMudGFza09iamVjdHMuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFRBU0tTX0xJU1QsIHRoaXMudGFza09iamVjdHMpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFRhc2sgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIERhdGUgY3JlYXRpb25UaW1lU3RhbXA7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jcmVhdGlvblRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArICI6ICIgKyB0aGlzLmNyZWF0aW9uVGltZVN0YW1wLmdldFRpbWUoKTsKLQkJfQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwN2I1OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVfTElTVCA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRSA9IFZBTFVFX0xJU1RbMF07Ci0KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgVkFMVUVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFswXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM1ZGYxNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4obmV3IEludGVnZXIoMCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCAtMzMsIDMzLCAxKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig1KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigtMzMpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKFNwaW5uZXJNb2RlbCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoKChOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4oKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgbmV3IEludGVnZXIoLTMzKSwgbmV3IEludGVnZXIoMzMpLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyZjczZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRGVmYXVsdExpc3RNb2RlbCBsaXN0TW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWw7Ci0KLQlwdWJsaWMgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uTW9kZWwodGhpcy5saXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgRGVmYXVsdExpc3RNb2RlbCBidWlsZExpc3RNb2RlbCgpIHsKLQkJRGVmYXVsdExpc3RNb2RlbCBsbSA9IG5ldyBEZWZhdWx0TGlzdE1vZGVsKCk7Ci0JCWxtLmFkZEVsZW1lbnQoImZvbyIpOwotCQlsbS5hZGRFbGVtZW50KCJiYXIiKTsKLQkJbG0uYWRkRWxlbWVudCgiYmF6Iik7Ci0JCXJldHVybiBsbTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFNlbGVjdGlvbk1vZGVsKExpc3RNb2RlbCBsbSkgewotCQlyZXR1cm4gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChsbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0RGF0YUxpc3RlbmVyKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0KDAsICJqYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbCgyLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnModGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnModGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpLCAiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoifSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoiLCAiamFyIn0pOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZVNlbGVjdGVkVmFsdWUoImphciIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6IiwgImpvbyIsICJqYXIifSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImpvbyJ9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRBbmNob3JTZWxlY3Rpb25JbmRleCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldEFuY2hvclNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExlYWRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiJ9KTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldExlYWRTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaW5NYXhTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImJhciIsICJqYXIifSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3RlZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJc1NlbGVjdGVkKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImJhciIsICJqYXIifSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJqYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0U2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVMaXN0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcgZm9yIG5vdy4uLgotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhODM4NGMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5QcmltaXRpdmVMaXN0VHJlZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFRyZWVNb2RlbCB0cmVlTW9kZWw7Ci0KLQlwdWJsaWMgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gdGhpcy5idWlsZFRlc3RNb2RlbCgpOwotCQl0aGlzLnRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsKHRoaXMuYnVpbGRMaXN0VmFsdWVNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByaW1pdGl2ZUNoYW5nZWQoaW50IGluZGV4LCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCQlpZiAoICEgbmV3VmFsdWUuZXF1YWxzKCIiKSkgewotCQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy50ZXN0TW9kZWwucmVwbGFjZU5hbWUoaW5kZXgsIChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/PiBidWlsZExpc3RWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRVNfTElTVCwgdGhpcy50ZXN0TW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldChpbnQgaW5kZXgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoaW5kZXgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByaW1pdGl2ZSgpIHsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MH0sIG5ldyBTdHJpbmdbXSB7ImZvbyJ9KTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmltaXRpdmUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXIiKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmF6Iik7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MX0sIG5ldyBTdHJpbmdbXSB7ImJhciJ9KTsKLQkJCX0KLQkJfSk7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy50ZXN0TW9kZWwucmVtb3ZlTmFtZSgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVByaW1pdGl2ZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJhciIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXoiKTsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHsxfSwgbmV3IFN0cmluZ1tdIHsiamFyIn0pOwotCQkJfQotCQl9KTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRlc3RNb2RlbC5yZXBsYWNlTmFtZSgxLCAiamFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbmFtZSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlUcmVlTW9kZWxFdmVudChUcmVlTW9kZWxFdmVudCBlLCBpbnRbXSBleHBlY3RlZENoaWxkSW5kaWNlcywgU3RyaW5nW10gZXhwZWN0ZWROYW1lcykgewotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRDaGlsZEluZGljZXMsIGUuZ2V0Q2hpbGRJbmRpY2VzKCkpKTsKLQkJT2JqZWN0W10gYWN0dWFsQ2hpbGRyZW4gPSBlLmdldENoaWxkcmVuKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZE5hbWVzLmxlbmd0aCwgYWN0dWFsQ2hpbGRyZW4ubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgYWN0dWFsQ2hpbGRyZW5baV07Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lc1tpXSwgbm9kZS5nZXRVc2VyT2JqZWN0KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBlLmdldFBhdGgoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpLCBlLmdldFBhdGgoKVswXSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyZWVNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lczsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfTElTVCA9ICJuYW1lcyI7Ci0JCi0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0KLQkKLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyBpbnQgbmFtZXNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZXMuc2l6ZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLmdldChpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWUsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkTmFtZSh0aGlzLm5hbWVzU2l6ZSgpLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhpbnQgaW5kZXgsIExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCB0aGlzLm5hbWVzLCBsaXN0LCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhMaXN0PFN0cmluZz4gbGlzdCkgewotCQkJdGhpcy5hZGROYW1lcyh0aGlzLm5hbWVzU2l6ZSgpLCBsaXN0KTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVtb3ZlTmFtZXMoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGluZGV4LCBsZW5ndGgsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVwbGFjZU5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmV3TmFtZSkgewotCQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChpbmRleCwgbmV3TmFtZSwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGNsYXNzIFRlc3RUcmVlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFRyZWVNb2RlbExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0YmJlYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCByZWRCdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciByZWRMaXN0ZW5lcjsKLQlib29sZWFuIHJlZEV2ZW50RmlyZWQ7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgZ3JlZW5MaXN0ZW5lcjsKLQlib29sZWFuIGdyZWVuRXZlbnRGaXJlZDsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJsdWVMaXN0ZW5lcjsKLQlib29sZWFuIGJsdWVFdmVudEZpcmVkOwotCi0vLwlwcml2YXRlIEJ1dHRvbkdyb3VwIGJ1dHRvbkdyb3VwOwkvLyBETyBOT1QgdXNlIGEgQnV0dG9uR3JvdXAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihudWxsKTsKLS8vCQlidXR0b25Hcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIFJFRCk7Ci0vLwkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0R3JvdXAoYnV0dG9uR3JvdXApOwotCQl0aGlzLnJlZExpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMucmVkRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlciA9IHRoaXMuYnVpbGRCdXR0b25Nb2RlbCh0aGlzLnZhbHVlSG9sZGVyLCBHUkVFTik7Ci0vLwkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuZ3JlZW5MaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmdyZWVuRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIEJMVUUpOwotLy8JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuYmx1ZUxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYmx1ZUV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCQkKLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZEJ1dHRvbk1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gcHZtLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihwdm0sIGJ1dHRvblZhbHVlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0ZW5Ub01vZGVsQWRhcHRlcnMoKSB7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMucmVkTGlzdGVuZXIpOwotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZ3JlZW5MaXN0ZW5lcik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJsdWVMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRmxhZ3MoKSB7Ci0JCXRoaXMucmVkRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmdyZWVuRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJsdWVFdmVudEZpcmVkID0gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEdSRUVOLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQkxVRSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoUkVELCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoQkxVRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoUkVEKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCk7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShHUkVFTik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEJMVUUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzczZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlJhZGlvQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmFkaW8gYnV0dG9ucy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgcmVkQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBncmVlbkJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoKTsKLQl9Ci0KLQlwcml2YXRlIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuY29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5SRUQpOwotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIodGhpcy5jb2xvckhvbGRlciwgVGVzdE1vZGVsLkdSRUVOKTsKLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIodGhpcy5jb2xvckhvbGRlciwgVGVzdE1vZGVsLkJMVUUpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgT2JqZWN0PihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9yUFZNLCBTdHJpbmcgY29sb3IpIHsKLQkJcmV0dXJuIG5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihjb2xvclBWTSwgY29sb3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0TG9jYXRpb24oMjAwLCAyMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmFkaW9CdXR0b25QYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFJhZGlvQnV0dG9uUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRSZWRSYWRpb0J1dHRvbigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEdyZWVuUmFkaW9CdXR0b24oKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRCbHVlUmFkaW9CdXR0b24oKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkUmVkUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgicmVkIik7Ci0JCXJhZGlvQnV0dG9uLnNldE1vZGVsKHRoaXMucmVkQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRHcmVlblJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoImdyZWVuIik7Ci0JCXJhZGlvQnV0dG9uLnNldE1vZGVsKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZEJsdWVSYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJibHVlIik7Ci0JCXJhZGlvQnV0dG9uLnNldE1vZGVsKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0Q29sb3JCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldENvbG9yQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0Q29sb3JBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldENvbG9yQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBjb2xvciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRDb2xvcigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0Q29sb3IoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldENvbG9yKFRlc3RNb2RlbC5ERUZBVUxUX0NPTE9SKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBjb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRSA9ICJibHVlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09MT1IgPSBSRUQ7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0NPTE9SUyA9IHsKLQkJCQlSRUQsCi0JCQkJR1JFRU4sCi0JCQkJQkxVRQotCQkJfTsKLQkKLQkJcHVibGljIFRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuY29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQlpZiAoICEgQXJyYXlUb29scy5jb250YWlucyhWQUxJRF9DT0xPUlMsIGNvbG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29sb3IpOwotCQkJfQotCQkJT2JqZWN0IG9sZCA9IHRoaXMuY29sb3I7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZCwgY29sb3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuY29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmI2NmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLlBlcnNvbkNvbHVtbkFkYXB0ZXI7Ci0KLS8qKgotICogTWFrZSBpdCBlYXN5IHRvIHRlc3QgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgYW5kCi0gKiByZW5kZXJlcnMgd2l0aG91dCBhbnkgZWRpdGluZyBhbGxvd2VkLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCBleHRlbmRzIFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmIwMjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBJbnRlZ2VyKDApKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLCBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig1KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciwgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gQ2xhc3NUb29scy5maWVsZFZhbHVlKGFkYXB0ZXIsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldENoYW5nZUxpc3RlbmVycyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJzLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IENsYXNzVG9vbHMuZmllbGRWYWx1ZShhZGFwdGVyLCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXRDaGFuZ2VMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJzLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZWJiMDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNwaW5uZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2Ygc3Bpbm5lcnMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYmlydGhEYXRlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJpcnRoRGF0ZVNwaW5uZXJNb2RlbDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBhZ2VIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYWdlU3Bpbm5lck1vZGVsOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGV5ZUNvbG9ySG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGV5ZUNvbG9yU3Bpbm5lck1vZGVsOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0KLQkJdGhpcy5iaXJ0aERhdGVIb2xkZXIgPSB0aGlzLmJ1aWxkQmlydGhEYXRlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5iaXJ0aERhdGVTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKHRoaXMuYmlydGhEYXRlSG9sZGVyKTsKLQotCQl0aGlzLmFnZUhvbGRlciA9IHRoaXMuYnVpbGRBZ2VIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFnZVNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRBZ2VTcGlubmVyTW9kZWwodGhpcy5hZ2VIb2xkZXIpOwotCi0JCXRoaXMuZXllQ29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkRXllQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEV5ZUNvbG9yU3Bpbm5lck1vZGVsKHRoaXMuZXllQ29sb3JIb2xkZXIpOwotCi0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaXJ0aERhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZEFnZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE51bWJlcj4odm0sIFRlc3RNb2RlbC5BR0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFnZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRBZ2UodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRBZ2VTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkuaW50VmFsdWUoKSwgVGVzdE1vZGVsLk1JTl9BR0UsIFRlc3RNb2RlbC5NQVhfQUdFLCAxKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5FWUVfQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkRXllQ29sb3JTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyLCBUZXN0TW9kZWwuVkFMSURfRVlFX0NPTE9SUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg2MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRTcGlubmVyUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTcGlubmVyUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWdlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEV5ZUNvbG9yU3Bpbm5lcigpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5iaXJ0aERhdGVTcGlubmVyTW9kZWwpOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZ2VTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYWdlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkRXllQ29sb3JTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuZXllQ29sb3JTcGlubmVyTW9kZWwpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0QmlydGhEYXRlKFRlc3RNb2RlbC5ERUZBVUxUX0JJUlRIX0RBVEUpOwotCQl0aGlzLnRlc3RNb2RlbC5zZXRFeWVDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9FWUVfQ09MT1IpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJpcnRoIGRhdGU6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXRCaXJ0aERhdGUoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWdlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QWdlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV5ZXM6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXRFeWVDb2xvcigpKTsKLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDYWxlbmRhciBiaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQkvLyAidmlydHVhbCIgcHJvcGVydGllcwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWSA9ICJiaXJ0aERhdGUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdFX1BST1BFUlRZID0gImFnZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9CSVJUSF9EQVRFID0gbmV3IERhdGUoKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQUdFID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9BR0UgPSAwOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FHRSA9IDE1MDsKLQkJcHJpdmF0ZSBTdHJpbmcgZXllQ29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUFJPUEVSVFkgPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9FWUVfQ09MT1JTID0geyJibHVlIiwgImJyb3duIiwgImdyZWVuIiwgImhhemVsIiwgInBpbmsifTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gVkFMSURfRVlFX0NPTE9SU1szXTsKLQkKLQkJVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0JJUlRIX0RBVEUsIERFRkFVTFRfRVlFX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKERhdGUgYmlydGhEYXRlLCBTdHJpbmcgZXllQ29sb3IpIHsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKGJpcnRoRGF0ZSk7Ci0JCQl0aGlzLnNldEV5ZUNvbG9yKGV5ZUNvbG9yKTsKLQkJfQotCQlwdWJsaWMgRGF0ZSBnZXRCaXJ0aERhdGUoKSB7Ci0JCQlyZXR1cm4gKERhdGUpIHRoaXMuYmlydGhDYWwuZ2V0VGltZSgpLmNsb25lKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QmlydGhEYXRlKERhdGUgYmlydGhEYXRlKSB7Ci0JCQlEYXRlIG9sZEJpcnRoRGF0ZSA9IHRoaXMuZ2V0QmlydGhEYXRlKCk7Ci0JCQlpbnQgb2xkQWdlID0gdGhpcy5nZXRBZ2UoKTsKLQkJCXRoaXMuYmlydGhDYWwuc2V0VGltZUluTWlsbGlzKGJpcnRoRGF0ZS5nZXRUaW1lKCkpOwotCQkJaW50IG5ld0FnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpZiAobmV3QWdlIDwgTUlOX0FHRSB8fCBuZXdBZ2UgPiBNQVhfQUdFKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihiaXJ0aERhdGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkQmlydGhEYXRlLCB0aGlzLmdldEJpcnRoRGF0ZSgpKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBR0VfUFJPUEVSVFksIG9sZEFnZSwgbmV3QWdlKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldEFnZSgpIHsKLQkJCUNhbGVuZGFyIGN1cnJlbnRDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJaW50IGFnZSA9IGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLllFQVIpIC0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuWUVBUik7Ci0JCQlpZiAoY3VycmVudENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpIDwgdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJYWdlLS07Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA9PSB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5NT05USCkpIHsKLQkJCQlpZiAoY3VycmVudENhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpIHsKLQkJCQkJYWdlLS07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGFnZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZ2UoaW50IG5ld0FnZSkgewotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YobmV3QWdlKSk7Ci0JCQl9Ci0JCi0JCQlpbnQgb2xkQWdlID0gdGhpcy5nZXRBZ2UoKTsKLQkJCWludCBkZWx0YSA9IG5ld0FnZSAtIG9sZEFnZTsKLQkKLQkJCUNhbGVuZGFyIG5ld0JpcnRoQ2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCW5ld0JpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyh0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5nZXRUaW1lKCkpOwotCQkJLy8gaWYgdGhlIGFnZSBpbmNyZWFzZWQsIHRoZSBiaXJ0aCBkYXRlIG11c3QgYmUgImRlY3JlYXNlZCI7IGFuZCB2aWNlIHZlcnNhCi0JCQluZXdCaXJ0aENhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgbmV3QmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpIC0gZGVsdGEpOwotCQkJdGhpcy5zZXRCaXJ0aERhdGUobmV3QmlydGhDYWwuZ2V0VGltZSgpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldEV5ZUNvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZXllQ29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXllQ29sb3IoU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQlpZiAoICEgQXJyYXlUb29scy5jb250YWlucyhWQUxJRF9FWUVfQ09MT1JTLCBleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbChiaXJ0aDogIiArIHRoaXMuZ2V0QmlydGhEYXRlKCkgKyAiIC0gZXllczogIiArIHRoaXMuZXllQ29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODQ2N2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENyb3dkIGNyb3dkOwotCVRhYmxlTW9kZWxFdmVudCBldmVudDsKLQotCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3Jvd2QgPSB0aGlzLmJ1aWxkQ3Jvd2QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJvd0NvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpKTsKLQkJLy8gd2UgbmVlZCB0byBhZGQgYSBsaXN0ZW5lciB0byB3YWtlIHVwIHRoZSBhZGFwdGVyCi0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jcm93ZC5wZW9wbGVTaXplKCksIHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5Db3VudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uQ29sdW1uQWRhcHRlci5DT0xVTU5fQ09VTlQsIHRhYmxlTW9kZWxBZGFwdGVyLmdldENvbHVtbkNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkpOwotCi0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWROYW1lcyA9IHRoaXMuc29ydGVkTmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNyb3dkLnBlb3BsZVNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc29ydGVkTmFtZXMuZ2V0KGkpLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRWYWx1ZUF0KGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX0pOwotCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbi5FWUVfQ09MT1JfQkxVRSwgcGVyc29uLmdldEV5ZUNvbG9yKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzb24uaXNFdmlsKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc29uLmdldFJhbmsoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpOyBpKyspIHsKLQkJCWlmICh0YWJsZU1vZGVsQWRhcHRlci5nZXRWYWx1ZUF0KGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pLmVxdWFscygiR29sbHVtIikpIHsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KFBlcnNvbi5FWUVfQ09MT1JfSEFaRUwsIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVlFX0NPTE9SX0NPTFVNTik7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChCb29sZWFuLlRSVUUsIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4pOwotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQobmV3IEludGVnZXIoLTEpLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLlJBTktfQ09MVU1OKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uLkVZRV9DT0xPUl9IQVpFTCwgcGVyc29uLmdldEV5ZUNvbG9yKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5pc0V2aWwoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgcGVyc29uLmdldFJhbmsoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJvdygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyBhZGQgYSBwZXJzb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB3ZSBvbmx5IHRyaWdnZXIgb25lIGV2ZW50Ci0JCXRoaXMuY3Jvd2QuYWRkUGVyc29uKCJaenp6eiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LklOU0VSVCwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkFMTF9DT0xVTU5TLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIHJlbW92aW5nIGEgcGVyc29uIHNob3VsZCBvbmx5IHRyaWdnZXIgb25lIGV2ZW50LCBzaW5jZSBhIHJlLXNvcnQgaXMgbm90IG5lZWRlZAotCQl0aGlzLmNyb3dkLnJlbW92ZVBlcnNvbih0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuREVMRVRFLCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuQUxMX0NPTFVNTlMsIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDZWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIGFkZCBhIHBlcnNvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlwZXJzb24uc2V0RXZpbCh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5VUERBVEUsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4sIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCVRhYmxlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlDZWxsTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJVGFibGVNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0KLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCi0JCXRhYmxlTW9kZWxBZGFwdGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVZJTF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IGJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpLCB0aGlzLmJ1aWxkQ29sdW1uQWRhcHRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxDcm93ZCwgUGVyc29uPihDcm93ZC5QRU9QTEVfQ09MTEVDVElPTiwgdGhpcy5jcm93ZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc29uPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZVNpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENyb3dkIGJ1aWxkQ3Jvd2QoKSB7Ci0JCUNyb3dkIHJlc3VsdCA9IG5ldyBDcm93ZCgpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJCaWxibyIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiU2Ftd2lzZSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbExpc3RlbmVyIGJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzb3J0ZWROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuY3Jvd2QucGVvcGxlTmFtZXMoKSkpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbExpc3RlbmVyIGJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCQkvLyB3ZSBleHBlY3Qgb25seSBhIHNpbmdsZSBldmVudAotCQkJCWlmIChUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPT0gbnVsbCkgewotCQkJCQlUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzb25Db2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDc7Ci0JCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklSVEhfREFURV9DT0xVTU4gPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHT05FX1dFU1RfREFURV9DT0xVTU4gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWUVfQ09MT1JfQ09MVU1OID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZJTF9DT0xVTU4gPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5LX0NPTFVNTiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEVkVOVFVSRV9DT1VOVF9DT0xVTU4gPSA2OwotCQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5fTkFNRVMgPSBuZXcgU3RyaW5nW10gewotCQkJIk5hbWUiLAotCQkJIkJpcnRoIiwKLQkJCSJHb25lIFdlc3QiLAotCQkJIkV5ZXMiLAotCQkJIkV2aWwiLAotCQkJIlJhbmsiLAotCQkJIkFkdmVudHVyZXMiCi0JCX07Ci0JCi0JCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBDT0xVTU5fTkFNRVNbaW5kZXhdOwotCQl9Ci0JCi0JCXB1YmxpYyBDbGFzczw/PiBjb2x1bW5DbGFzcyhpbnQgaW5kZXgpIHsKLQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQljYXNlIE5BTUVfQ09MVU1OOgkJCQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCQljYXNlIEJJUlRIX0RBVEVfQ09MVU1OOgkJCXJldHVybiBEYXRlLmNsYXNzOwotCQkJCWNhc2UgR09ORV9XRVNUX0RBVEVfQ09MVU1OOglyZXR1cm4gRGF0ZS5jbGFzczsKLQkJCQljYXNlIEVZRV9DT0xPUl9DT0xVTU46CQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCQljYXNlIEVWSUxfQ09MVU1OOgkJCQkJcmV0dXJuIEJvb2xlYW4uY2xhc3M7Ci0JCQkJY2FzZSBSQU5LX0NPTFVNTjoJCQkJCXJldHVybiBJbnRlZ2VyLmNsYXNzOwotCQkJCWNhc2UgQURWRU5UVVJFX0NPVU5UX0NPTFVNTjpyZXR1cm4gSW50ZWdlci5jbGFzczsKLQkJCQlkZWZhdWx0OiAJCQkJCQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJfQotCQl9Ci0JCi0JCXB1YmxpYyBib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggIT0gTkFNRV9DT0xVTU47Ci0JCX0KLQkKLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KSB7Ci0JCQlQZXJzb24gcGVyc29uID0gKFBlcnNvbikgc3ViamVjdDsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJlc3VsdCA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFtDT0xVTU5fQ09VTlRdOwotCQotCQkJcmVzdWx0W05BTUVfQ09MVU1OXSA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0JJUlRIX0RBVEVfQ09MVU1OXSA9IHRoaXMuYnVpbGRCaXJ0aERhdGVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbR09ORV9XRVNUX0RBVEVfQ09MVU1OXSA9IHRoaXMuYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbRVlFX0NPTE9SX0NPTFVNTl0gPSB0aGlzLmJ1aWxkRXllQ29sb3JBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbRVZJTF9DT0xVTU5dID0gdGhpcy5idWlsZEV2aWxBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbUkFOS19DT0xVTU5dID0gdGhpcy5idWlsZFJhbmtBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbQURWRU5UVVJFX0NPVU5UX0NPTFVNTl0gPSB0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKHBlcnNvbik7Ci0JCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZE5hbWVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uTkFNRV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUoKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQmlydGhEYXRlQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpcnRoRGF0ZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5HT05FX1dFU1RfREFURV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEdvbmVXZXN0RGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV2aWxBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVZJTF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRXZpbCgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RXZpbCgoKEJvb2xlYW4pdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZFJhbmtBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uUkFOS19QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0UmFuaygpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0UmFuaygoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0QWR2ZW50dXJlQ291bnQoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ3Jvd2QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFBlcnNvbj4gcGVvcGxlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVPUExFX0NPTExFQ1RJT04gPSAicGVvcGxlIjsKLQkKLQkJcHVibGljIENyb3dkKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVvcGxlID0gbmV3IEFycmF5TGlzdDxQZXJzb24+KCk7Ci0JCX0KLQkKLQkKLQkJcHVibGljIEl0ZXJhdG9yPFBlcnNvbj4gcGVvcGxlKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFBlcnNvbj4odGhpcy5wZW9wbGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoUGVyc29uIHBlcnNvbikgewotCQkJCQlDcm93ZC50aGlzLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIGludCBwZW9wbGVTaXplKCkgewotCQkJcmV0dXJuIHRoaXMucGVvcGxlLnNpemUoKTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIGFkZFBlcnNvbihTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jaGVja1BlcnNvbk5hbWUobmFtZSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRQZXJzb24obmV3IFBlcnNvbih0aGlzLCBuYW1lKSk7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBQZXJzb24gYWRkUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gcGVyc29uOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVvcGxlKENvbGxlY3Rpb248UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZW9wbGUoSXRlcmF0b3I8UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQl2b2lkIGNoZWNrUGVyc29uTmFtZShTdHJpbmcgcGVyc29uTmFtZSkgewotCQkJaWYgKHBlcnNvbk5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnBlb3BsZU5hbWVzKCksIHBlcnNvbk5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwZXJzb25OYW1lKTsKLQkJCX0KLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBwZW9wbGVOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzb24sIFN0cmluZz4odGhpcy5wZW9wbGUuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNvbiBwZXJzb24pIHsKLQkJCQkJcmV0dXJuIHBlcnNvbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIHBlcnNvbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5wZW9wbGUuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJUGVyc29uIHBlcnNvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKHBlcnNvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBwZXJzb247Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBTdHJpbmcudmFsdWVPZih0aGlzLnBlb3BsZS5zaXplKCkpICsgIiBwZW9wbGUiKTsKLQkJfQotCQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDb21wYXJhYmxlPFBlcnNvbj4gewotCQlwcml2YXRlIENyb3dkIGNyb3dkOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWT0gIm5hbWUiOwotCQlwcml2YXRlIERhdGUgYmlydGhEYXRlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWT0gImJpcnRoRGF0ZSI7Ci0JCXByaXZhdGUgRGF0ZSBnb25lV2VzdERhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT05FX1dFU1RfREFURV9QUk9QRVJUWT0gImdvbmVXZXN0RGF0ZSI7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JST1dOID0gImJyb3duIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9IQVpFTCA9ICJoYXplbCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUElOSyA9ICJwaW5rIjsKLQkJCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiB2YWxpZEV5ZUNvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gRVlFX0NPTE9SX0JMVUU7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmlsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZJTF9QUk9QRVJUWT0gImV2aWwiOwotCQlwcml2YXRlIGludCByYW5rOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19QUk9QRVJUWT0gInJhbmsiOwotCQlwcml2YXRlIGludCBhZHZlbnR1cmVDb3VudDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWT0gImFkdmVudHVyZUNvdW50IjsKLQkKLQkJUGVyc29uKENyb3dkIGNyb3dkLCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY3Jvd2QgPSBjcm93ZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmJpcnRoRGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCQlDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWMuYWRkKENhbGVuZGFyLllFQVIsIDI1MCk7Ci0JCQl0aGlzLmdvbmVXZXN0RGF0ZSA9IG5ldyBEYXRlKGMuZ2V0VGltZUluTWlsbGlzKCkpOwotCQkJdGhpcy5leWVDb2xvciA9IERFRkFVTFRfRVlFX0NPTE9SOwotCQkJdGhpcy5ldmlsID0gZmFsc2U7Ci0JCQl0aGlzLnJhbmsgPSAwOwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IDA7Ci0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0VmFsaWRFeWVDb2xvcnMoKSB7Ci0JCQlpZiAodmFsaWRFeWVDb2xvcnMgPT0gbnVsbCkgewotCQkJCXZhbGlkRXllQ29sb3JzID0gYnVpbGRWYWxpZEV5ZUNvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkRXllQ29sb3JzOwotCQl9Ci0JCi0JCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFZhbGlkRXllQ29sb3JzKCkgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfQkxVRSk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9HUkVFTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9CUk9XTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9IQVpFTCk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9QSU5LKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIENyb3dkIGdldENyb3dkKCkgewotCQkJcmV0dXJuIHRoaXMuY3Jvd2Q7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNyb3dkLmNoZWNrUGVyc29uTmFtZShuYW1lKTsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuYmlydGhEYXRlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuYmlydGhEYXRlOwotCQkJdGhpcy5iaXJ0aERhdGUgPSBiaXJ0aERhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkLCBiaXJ0aERhdGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBEYXRlIGdldEdvbmVXZXN0RGF0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHb25lV2VzdERhdGUoRGF0ZSBnb25lV2VzdERhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJCXRoaXMuZ29uZVdlc3REYXRlID0gZ29uZVdlc3REYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdPTkVfV0VTVF9EQVRFX1BST1BFUlRZLCBvbGQsIGdvbmVXZXN0RGF0ZSk7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCEgZ2V0VmFsaWRFeWVDb2xvcnMoKS5jb250YWlucyhleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gaXNFdmlsKCkgewotCQkJcmV0dXJuIHRoaXMuZXZpbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFdmlsKGJvb2xlYW4gZXZpbCkgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmV2aWw7Ci0JCQl0aGlzLmV2aWwgPSBldmlsOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVWSUxfUFJPUEVSVFksIG9sZCwgZXZpbCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRSYW5rKCkgewotCQkJcmV0dXJuIHRoaXMucmFuazsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRSYW5rKGludCByYW5rKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5yYW5rOwotCQkJdGhpcy5yYW5rID0gcmFuazsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSQU5LX1BST1BFUlRZLCBvbGQsIHJhbmspOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0QWR2ZW50dXJlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZHZlbnR1cmVDb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZHZlbnR1cmVDb3VudChpbnQgYWR2ZW50dXJlQ291bnQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IGFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgb2xkLCBhZHZlbnR1cmVDb3VudCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBjb21wYXJlVG8oUGVyc29uIHApIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShwLm5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArIAotCQkJCQkJIlx0Ym9ybjogIiArIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KHRoaXMuYmlydGhEYXRlKSArIAotCQkJCQkJIlx0Z29uZSB3ZXN0OiAiICsgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5nb25lV2VzdERhdGUpICsgCi0JCQkJCQkiXHRleWVzOiAiICsgdGhpcy5leWVDb2xvciArIAotCQkJCQkJIlx0ZXZpbDogIiArIHRoaXMuZXZpbCArIAotCQkJCQkJIlx0cmFuazogIiArIHRoaXMucmFuayArCi0JCQkJCQkiXHRhZHZlbnR1cmVzOiAiICsgdGhpcy5hZHZlbnR1cmVDb3VudAotCQkJOwotCQl9Ci0JCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUYWJsZU1vZGVsTGlzdGVuZXIgewotCQlUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjcwYjI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkNoZWNrQm94VGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TcGlubmVyVGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuVGFibGVDZWxsRWRpdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLkNyb3dkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uQ29sdW1uQWRhcHRlcjsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHRoZSBUYWJsZU1vZGVsQWRhcHRlcgotICogCSJuYW1lIiBjb2x1bW4gaXMgcmVhZC1vbmx5IHRleHQgZmllbGQKLSAqIAkiYmlydGggZGF0ZSIgY29sdW1uIGlzIGRhdGUgdGV4dCBmaWVsZAotICogCSJnb25lIHdlc3QgZGF0ZSIgY29sdW1uIGlzIGRhdGUgc3Bpbm5lcgotICogCSJleWUgY29sb3IiIGNvbHVtbiBpcyBjb21iby1ib3gKLSAqIAkiZXZpbCIgY29sdW1uIGlzIGNoZWNrIGJveAotICogCSJyYW5rIiBjb2x1bW4gaXMgbnVtYmVyIHRleHQgZmllbGQKLSAqIAkiYWR2ZW50dXJlIGNvdW50IiBjb2x1bW4gaXMgbnVtYmVyIHNwaW5uZXIKLSAqIAotICogTm90ZSB0aGF0IHRoZSB0YWJsZSBtb2RlbCBhbmQgcm93IHNlbGVjdGlvbiBtb2RlbCBzaGFyZSB0aGUgc2FtZQotICogbGlzdCB2YWx1ZSBtb2RlbCAodGhlIHNvcnRlZCBwZW9wbGUgYWRhcHRlcikKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvcnNIb2xkZXI7ICAvLyBPYmplY3QgYmVjYXVzZSBpdCBhZGFwdHMgdG8gYSBjb21iby1ib3gKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBjcm93ZEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gc2VsZWN0ZWRQZXJzb25Ib2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IHNvcnRlZFBlb3BsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBUYWJsZU1vZGVsIHRhYmxlTW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgcm93U2VsZWN0aW9uTW9kZWw7Ci0JcHJpdmF0ZSBBY3Rpb24gcmVtb3ZlQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLQkJdGhpcy5leWVDb2xvcnNIb2xkZXIgPSB0aGlzLiBidWlsZEV5ZUNvbG9yQ29sbGVjdGlvbkhvbGRlcigpOwotCQl0aGlzLmNyb3dkSG9sZGVyID0gdGhpcy5idWlsZENyb3dkSG9sZGVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRQZXJzb25Ib2xkZXIoKTsKLQkJdGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyID0gdGhpcy5idWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKTsKLQkJdGhpcy50YWJsZU1vZGVsID0gdGhpcy5idWlsZFRhYmxlTW9kZWwoKTsKLQkJdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRSb3dTZWxlY3Rpb25Nb2RlbCgpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckNvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PihuZXcgQXJyYXlMaXN0PE9iamVjdD4oUGVyc29uLmdldFZhbGlkRXllQ29sb3JzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBidWlsZENyb3dkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4odGhpcy5idWlsZENyb3dkKCkpOwotCX0KLQotCXByaXZhdGUgQ3Jvd2QgYnVpbGRDcm93ZCgpIHsKLQkJQ3Jvd2QgY3Jvd2QgPSBuZXcgQ3Jvd2QoKTsKLQotCQlQZXJzb24gcCA9IGNyb3dkLmFkZFBlcnNvbigiQmlsYm8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JST1dOKTsKLQkJcC5zZXRSYW5rKDIyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX1BJTkspOwotCQlwLnNldEV2aWwodHJ1ZSk7Ci0JCXAuc2V0UmFuaygyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCg1MCk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JMVUUpOwotCQlwLnNldFJhbmsoMzQpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIlNhbXdpc2UiKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0dSRUVOKTsKLQkJcC5zZXRSYW5rKDE5KTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlyZXR1cm4gY3Jvd2Q7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkU2VsZWN0ZWRQZXJzb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxQZXJzb24+KHRoaXMuYnVpbGRQZW9wbGVOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQkvLyB0aGUgbGlzdCB3aWxsIG5lZWQgdG8gYmUgcmUtc29ydGVkIGlmIGEgbmFtZSBjaGFuZ2VzCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZUFkYXB0ZXIoKSwgUGVyc29uLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8Q3Jvd2QsIFBlcnNvbj4odGhpcy5jcm93ZEhvbGRlciwgQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNvbj4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGVTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsIGJ1aWxkVGFibGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuc29ydGVkUGVvcGxlQWRhcHRlciwgdGhpcy5idWlsZENvbHVtbkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFJvd1NlbGVjdGlvbk1vZGVsKCkgewotCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgcnNtID0gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLnNvcnRlZFBlb3BsZUFkYXB0ZXIpKTsKLQkJcnNtLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkUm93U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJzbS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLQkJcmV0dXJuIHJzbTsKLQl9Ci0KLQlwcml2YXRlIExpc3RTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJvd1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLmdldFZhbHVlSXNBZGp1c3RpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucm93U2VsZWN0aW9uQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHJvd1NlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlQZXJzb24gc2VsZWN0aW9uID0gKFBlcnNvbikgdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCXRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0aW9uKTsKLQkJYm9vbGVhbiBwZXJzb25TZWxlY3RlZCA9IChzZWxlY3Rpb24gIT0gbnVsbCk7Ci0JCXRoaXMucmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQocGVyc29uU2VsZWN0ZWQpOwotCQl0aGlzLnJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKHBlcnNvblNlbGVjdGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigyMDAsIDIwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDYwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRhYmxlUGFuZSgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUYWJsZVBhbmUoKSB7Ci0JCXJldHVybiBuZXcgSlNjcm9sbFBhbmUodGhpcy5idWlsZFRhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSlRhYmxlIGJ1aWxkVGFibGUoKSB7Ci0JCUpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUodGhpcy50YWJsZU1vZGVsKTsKLQkJdGFibGUucHV0Q2xpZW50UHJvcGVydHkoInRlcm1pbmF0ZUVkaXRPbkZvY3VzTG9zdCIsIEJvb2xlYW4uVFJVRSk7CS8vIHNlZSBKYXZhIGJ1ZyA1MDA3NjUyCi0JCXRhYmxlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMucm93U2VsZWN0aW9uTW9kZWwpOwotCQl0YWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJdGFibGUuc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX05FWFRfQ09MVU1OKTsKLQkJaW50IHJvd0hlaWdodCA9IDIwOwkvLyBzdGFydCB3aXRoIG1pbmltdW0gb2YgMjAKLQotCQkvLyBnb25lIHdlc3QgY29sdW1uIChzcGlubmVyKQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkdPTkVfV0VTVF9EQVRFX0NPTFVNTik7Ci0JCVNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBzcGlubmVyUmVuZGVyZXIgPSB0aGlzLmJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKHNwaW5uZXJSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBzcGlubmVyUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGV5ZSBjb2xvciBjb2x1bW4gKGNvbWJvLWJveCkKLQkJLy8gdGhlIGpkayBjb21iby1ib3ggcmVuZGVyZXIgbG9va3MgbGlrZSBhIHRleHQgZmllbGQKLQkJLy8gdW50aWwgdGhlIHVzZXIgc3RhcnRzIGFuIGVkaXQgLSB1c2UgYSBjdXN0b20gb25lCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVlFX0NPTE9SX0NPTFVNTik7Ci0JCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgZXllQ29sb3JSZW5kZXJlciA9IHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihleWVDb2xvclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgZXllQ29sb3JSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gZXZpbCAoY2hlY2sgYm94KQotCQkvLyB0aGUgamRrIGNoZWNrIGJveCByZW5kZXJlciBhbmQgZWRpdG9yIHN1Y2sgLSB1c2UgYSBjdXN0b20gb25lcwotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OKTsKLQkJQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBldmlsUmVuZGVyZXIgPSBuZXcgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKGV2aWxSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKG5ldyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBldmlsUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGFkdmVudHVyZSBjb3VudCBjb2x1bW4gKHNwaW5uZXIpCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuQURWRU5UVVJFX0NPVU5UX0NPTFVNTik7Ci0JCXNwaW5uZXJSZW5kZXJlciA9IHRoaXMuYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihzcGlubmVyUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBzcGlubmVyUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCXRhYmxlLnNldFJvd0hlaWdodChyb3dIZWlnaHQpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcihuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIobmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCkpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBidWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIobmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIobmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcih0aGlzLmJ1aWxkUmVhZE9ubHlFeWVDb2xvckNvbWJvQm94TW9kZWwoKSwgdGhpcy5idWlsZEV5ZUNvbG9yUmVuZGVyZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIGJ1aWxkUmVhZE9ubHlFeWVDb2xvckNvbWJvQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5leWVDb2xvcnNIb2xkZXIsIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRFeWVDb2xvclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEV5ZUNvbG9yUmVuZGVyZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRCdXR0b25QYW5lbCgpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUGVyc29uUGFuZWwoKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRCdXR0b25QYW5lbCgpIHsKLQkJSlBhbmVsIGJ1dHRvblBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkRXllQ29sb3JCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBidXR0b25QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFBlcnNvblBhbmVsKCkgewotCQlKUGFuZWwgcGVyc29uUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkR29uZVdlc3REYXRlU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94KCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEV2aWxDaGVja0JveCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRSYW5rU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSk7Ci0JCXJldHVybiBwZXJzb25QYW5lbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFBlcnNvbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZFBlcnNvbigpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWVGcm9tVXNlcigpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkUGVyc29uKHRoaXMuY3Jvd2QoKS5hZGRQZXJzb24obmFtZSkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZUFjdGlvbigpIHsKLQkJdGhpcy5yZW1vdmVBY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMucmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5yZW1vdmVBY3Rpb247Ci0JfQotCi0Jdm9pZCByZW1vdmVQZXJzb24oKSB7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLnNlbGVjdGVkUGVyc29uKCk7Ci0JCWlmIChwZXJzb24gIT0gbnVsbCkgewotCQkJdGhpcy5jcm93ZCgpLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbmFtZSBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVuYW1lQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbmFtZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbmFtZUFjdGlvbigpIHsKLQkJdGhpcy5yZW5hbWVBY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbmFtZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMucmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5yZW5hbWVBY3Rpb247Ci0JfQotCi0Jdm9pZCByZW5hbWVQZXJzb24oKSB7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLnNlbGVjdGVkUGVyc29uKCk7Ci0JCWlmIChwZXJzb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnByb21wdFVzZXJGb3JOYW1lKHBlcnNvbi5nZXROYW1lKCkpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCXBlcnNvbi5zZXROYW1lKG5hbWUpOwotCQkJCXRoaXMuc2V0U2VsZWN0ZWRQZXJzb24ocGVyc29uKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgZXllIGNvbG9yIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRFeWVDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRFeWVDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEV5ZUNvbG9yQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQgZXllIGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRFeWVDb2xvcigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZEV5ZUNvbG9yKCkgewotCQlTdHJpbmcgY29sb3IgPSB0aGlzLnByb21wdFVzZXJGb3JFeWVDb2xvcigpOwotCQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQkJdGhpcy5leWVDb2xvcnNIb2xkZXIuYWRkKGNvbG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb21wdFVzZXJGb3JFeWVDb2xvcigpIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVN0cmluZyBleWVDb2xvciA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZygiRXllIENvbG9yIik7Ci0JCQlpZiAoZXllQ29sb3IgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwkJLy8gdXNlciBwcmVzc2VkIDxDYW5jZWw+Ci0JCQl9Ci0JCQlpZiAoKGV5ZUNvbG9yLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBleWUgY29sb3IgaXMgcmVxdWlyZWQuIiwgIkludmFsaWQgRXllIENvbG9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV5ZUNvbG9yc0hvbGRlci5pdGVyYXRvcigpLCBleWVDb2xvcikpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIGV5ZSBjb2xvciBhbHJlYWR5IGV4aXN0cy4iLCAiSW52YWxpZCBFeWUgQ29sb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGV5ZUNvbG9yOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50IGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRDcm93ZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50Q3Jvd2QoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmNyb3dkKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5jcm93ZCgpLnBlb3BsZSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzZXQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0QnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0QWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0KCkgewotCQl0aGlzLmNyb3dkSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRDcm93ZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmV3IG5hbWUgZGlhbG9nICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVGcm9tVXNlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvbXB0VXNlckZvck5hbWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvbXB0VXNlckZvck5hbWUoU3RyaW5nIG9yaWdpbmFsTmFtZSkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIG5hbWUgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coIlBlcnNvbiBOYW1lIik7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyB1c2VyIHByZXNzZWQgPENhbmNlbD4KLQkJCX0KLQkJCWlmICgobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgbmFtZSBpcyByZXF1aXJlZC4iLCAiSW52YWxpZCBOYW1lIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNyb3dkKCkucGVvcGxlTmFtZXMoKSwgbmFtZSkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwgIkludmFsaWQgTmFtZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lIHRleHQgZmllbGQgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGROYW1lVGV4dEZpZWxkKCkgewotCQlKVGV4dEZpZWxkIHRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKHRoaXMuYnVpbGROYW1lRG9jdW1lbnQoKSwgbnVsbCwgMCk7Ci0JCXRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiB0ZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZE5hbWVEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIodGhpcy5idWlsZE5hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIFN0cmluZz4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmlydGggZGF0ZSBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEJpcnRoRGF0ZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQmlydGhEYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdvbmUgd2VzdCBkYXRlIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkdPTkVfV0VTVF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0R29uZVdlc3REYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV5ZSBjb2xvciBjb21iby1ib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRFeWVDb2xvckNvbWJvQm94KCkgewotCQlyZXR1cm4gbmV3IEpDb21ib0JveCh0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZEV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmV5ZUNvbG9yc0hvbGRlciwgdGhpcy5idWlsZEV5ZUNvbG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXZpbCBjaGVjayBib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRFdmlsQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjaGVja0JveCA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZXZpbCIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmJ1aWxkRXZpbENoZWNrQm94TW9kZWwoKSk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkRXZpbENoZWNrQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEV2aWxBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFdmlsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBCb29sZWFuPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uRVZJTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0V2aWwoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV2aWwodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByYW5rIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZFJhbmtTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRSYW5rU3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkUmFua1NwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRSYW5rQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRSYW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5SQU5LX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRSYW5rKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFJhbmsodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkdmVudHVyZSBjb3VudCBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5BRFZFTlRVUkVfQ09VTlRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFkdmVudHVyZUNvdW50KCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByaXZhdGUgQ3Jvd2QgY3Jvd2QoKSB7Ci0JCXJldHVybiB0aGlzLmNyb3dkSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBQZXJzb24gc2VsZWN0ZWRQZXJzb24oKSB7Ci0JCWlmICh0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChQZXJzb24pIHRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCXRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShwZXJzb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b20gcmVuZGVyZXIgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoaXMgaXMgc2ltcGx5IGFuIGV4YW1wbGUgb2YgYSByZW5kZXJlciBmb3IgdGhlIGVtYmVkZGVkIGNvbWJvLWJveC4KLQkgKiBJdCBkb2VzIG5vdGhpbmcgc3BlY2lhbCB1bmxlc3MgeW91IHVuY29tbWVudCB0aGUgY29kZSBiZWxvdy4uLi4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEV5ZUNvbG9yUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlciB7Ci0JCUV5ZUNvbG9yUmVuZGVyZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJCS8vIGp1c3QgZG8gc29tZXRoaW5nIHRvIHNob3cgdGhlIHJlbmRlcmVyIGlzIHdvcmtpbmcuLi4KLQkvLwkJdmFsdWUgPSAiPiIgKyB2YWx1ZTsKLQkJCXJldHVybiBzdXBlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzA5NmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb290KCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygicm9vdCIsIHJvb3QuZ2V0TmFtZSgpKTsKLS8vCQlyb290LmR1bXAoKTsKLS8vCQlyb290Tm9kZS5kdW1wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENoaWxkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJVGVzdE5vZGUgZXhwZWN0ZWQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE5vZGUgYWN0dWFsID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Q2hpbGQocm9vdE5vZGUsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0KLQkJZXhwZWN0ZWQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJYWN0dWFsID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Q2hpbGQocm9vdE5vZGUsIDIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENoaWxkQ291bnQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlhc3NlcnRFcXVhbHMoNSwgdHJlZU1vZGVsLmdldENoaWxkQ291bnQocm9vdE5vZGUpKTsKLQotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEVxdWFscygxLCB0cmVlTW9kZWwuZ2V0Q2hpbGRDb3VudChub2RlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluZGV4T2ZDaGlsZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCVRlc3ROb2RlIGNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAwIik7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCi0JCWNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEVxdWFscygxLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCi0JCWNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCWFzc2VydEVxdWFscygyLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCQlUZXN0Tm9kZSBncmFuZGNoaWxkID0gY2hpbGQuY2hpbGROYW1lZCgibm9kZSAyLjIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQoY2hpbGQsIGdyYW5kY2hpbGQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZWFmKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCWFzc2VydEZhbHNlKHRyZWVNb2RlbC5pc0xlYWYocm9vdE5vZGUpKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlhc3NlcnRGYWxzZSh0cmVlTW9kZWwuaXNMZWFmKG5vZGUpKTsKLQkJbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMyIpOwotCQlhc3NlcnRUcnVlKHRyZWVNb2RlbC5pc0xlYWYobm9kZSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc0NoYW5nZWQoKSB7Ci0JCS8vIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgIm5vZGUgY2hhbmdlZCIgZXZlbnQgaXMgdG8gdXNlIGFuIHVuc29ydGVkIHRyZWU7Ci0JCS8vIGEgc29ydGVkIHRyZWUgd2lsbCB3aWxsIHRyaWdnZXIgb25seSAibm9kZSByZW1vdmVkIiBhbmQgIm5vZGUgaW5zZXJ0ZWQiIGV2ZW50cwotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5zZXROYW1lKCJub2RlIDErKyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCW5vZGUgPSBub2RlLmNoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCXRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uc2V0TmFtZSgibm9kZSAxLjErKyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc0luc2VydGVkKCkgewotCQkvLyB1c2UgYW4gdW5zb3J0ZWQgdHJlZSBzbyB0aGUgbm9kZXMgYXJlIG5vdCByZS1zaHVmZmxlZC4uLgotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE1vZGVsIHRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uYWRkQ2hpbGQoIm5ldyBjaGlsZC4uLiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCW5vZGUgPSBub2RlLmNoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCXRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uYWRkQ2hpbGQoImFub3RoZXIgbmV3IGNoaWxkLi4uIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzUmVtb3ZlZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXJvb3QucmVtb3ZlQ2hpbGQocm9vdC5jaGlsZE5hbWVkKCJub2RlIDMiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5yZW1vdmVDaGlsZCh0bS5jaGlsZE5hbWVkKCJub2RlIDIuMiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlU3RydWN0dXJlQ2hhbmdlZCgpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IG5vZGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZU1vZGVsKG5vZGVIb2xkZXIpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJbm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBwcm9ibGVtIHdlIGhhZCB3aGVyZSByZW1vdmluZyBhIGNoaWxkIGZyb20gYSB0cmVlIHdvdWxkIGNhdXNlCi0JICogdGhlIEpUcmVlIHRvIGNhbGwgI2VxdWFscyhPYmplY3QpIG9uIGVhY2ggbm9kZSByZW1vdmVkIChhY3R1YWxseSwgaXQgd2FzCi0JICogVHJlZVBhdGgsIGJ1dCB0aGF0IHdhcyBiZWNhdXNlIGl0cyBvd24gI2VxdWFscyhPYmplY3QpIHdhcyBjYWxsZWQgYnkKLQkgKiBKVHJlZSk7IGFuZCBzaW5jZSB3ZSBoYWQgYWxyZWFkeSByZW1vdmVkIHRoZSBsYXN0IGxpc3RlbmVyIGZyb20gdGhlCi0JICogYXNwZWN0IGFkYXB0ZXIsIHRoZSBhc3BlY3QgYWRhcHRlciB3b3VsZCBzYXkgaXRzIHZhbHVlIHdhcyBudWxsOyB0aGlzCi0JICogd291bGQgY2F1c2UgYSBOUEUgdW50aWwgd2UgdHdlYWtlZCBUcmVlTW9kZWxBZGFwdGVyIHRvIHJlbW92ZSBpdHMKLQkgKiBsaXN0ZW5lcnMgZnJvbSBhIG5vZGUgb25seSAqYWZ0ZXIqIHRoZSBub2RlIGhhZCBiZWVuIGNvbXBsZXRlbHkKLQkgKiByZW1vdmVkIGZyb20gdGhlIEpUcmVlCi0JICogQHNlZSBUcmVlTW9kZWxBZGFwdGVyI3JlbW92ZU5vZGUoT2JqZWN0W10sIGludCwgVHJlZU5vZGVWYWx1ZU1vZGVsKQotCSAqIEBzZWUgVHJlZU1vZGVsQWRhcHRlciNhZGROb2RlKE9iamVjdFtdLCBpbnQsIFRyZWVOb2RlVmFsdWVNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUluaXRpYWxpemF0aW9uKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNwZWNpYWxUcmVlTW9kZWwoKTsKLQkJSlRyZWUgalRyZWUgPSBuZXcgSlRyZWUodHJlZU1vZGVsKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCS8vIHRoaXMgd291bGQgY2F1c2UgYSBOUEU6Ci0JCXJvb3QucmVtb3ZlQ2hpbGQocm9vdC5jaGlsZE5hbWVkKCJub2RlIDMiKSk7Ci0JCWFzc2VydEVxdWFscyh0cmVlTW9kZWwsIGpUcmVlLmdldE1vZGVsKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFVuc29ydGVkUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFVuc29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFNwZWNpYWxUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKHRoaXMuYnVpbGRTcGVjaWFsUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFNwZWNpYWxSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTcGVjaWFsVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0TW9kZWwgcm9vdCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJLypOb2RlIG5vZGVfMCA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSAwIik7Ci0JCVRlc3RNb2RlbCBub2RlXzEgPSByb290LmFkZENoaWxkKCJub2RlIDEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMV8xID0gbm9kZV8xLmFkZENoaWxkKCJub2RlIDEuMSIpOwotCQkvKk5vZGUgbm9kZV8xXzFfMSA9ICovbm9kZV8xXzEuYWRkQ2hpbGQoIm5vZGUgMS4xLjEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMiA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMiIpOwotCQkvKk5vZGUgbm9kZV8yXzAgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjAiKTsKLQkJLypOb2RlIG5vZGVfMl8xID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4xIik7Ci0JCS8qTm9kZSBub2RlXzJfMiA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzMgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjMiKTsKLQkJLypOb2RlIG5vZGVfMl80ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi40Iik7Ci0JCS8qTm9kZSBub2RlXzJfNSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNSIpOwotCQkvKk5vZGUgbm9kZV8zID0gKi9yb290LmFkZENoaWxkKCJub2RlIDMiKTsKLQkJLypOb2RlIG5vZGVfNCA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSA0Iik7Ci0JCXJldHVybiByb290OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIGEgdHlwaWNhbCBtb2RlbCBjbGFzcyB3aXRoIHRoZSB0eXBpY2FsIGNoYW5nZSBub3RpZmljYXRpb25zCi0JICogZm9yICNuYW1lIGFuZCAjY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQkvLyB0aGUgIHBhcmVudCBpcyBpbW11dGFibGU7IHRoZSByb290J3MgcGFyZW50IGlzIG51bGwKLQkJcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgcGFyZW50OwotCi0JCS8vIHRoZSBuYW1lIGlzIG11dGFibGU7IHNvIEkgZ3Vlc3MgaXQgaXNuJ3QgdGhlICJwcmltYXJ5IGtleSIgOi0pCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0TW9kZWw+IGNoaWxkcmVuOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU5fQ09MTEVDVElPTiA9ICJjaGlsZHJlbiI7Ci0KLQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7CS8vIHJvb3QgY3RvcgotCQkJdGhpcyhudWxsLCBuYW1lKTsKLQkJfQotCQlwcml2YXRlIFRlc3RNb2RlbChUZXN0TW9kZWwgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0TW9kZWw+KCk7Ci0JCX0KLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0TW9kZWw+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFRlc3RNb2RlbD4odGhpcy5jaGlsZHJlbik7Ci0JCX0KLQkJcHVibGljIGludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbCBhZGRDaGlsZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlUZXN0TW9kZWwgY2hpbGQgPSBuZXcgVGVzdE1vZGVsKHRoaXMsIGNoaWxkTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oY2hpbGQsIHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIGNoaWxkOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWxbXSBhZGRDaGlsZHJlbihTdHJpbmdbXSBjaGlsZE5hbWVzKSB7Ci0JCQlUZXN0TW9kZWxbXSBuZXdDaGlsZHJlbiA9IG5ldyBUZXN0TW9kZWxbY2hpbGROYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3Q2hpbGRyZW5baV0gPSBuZXcgVGVzdE1vZGVsKHRoaXMsIGNoaWxkTmFtZXNbaV0pOwotCQkJfQotCQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihuZXdDaGlsZHJlbiwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVGVzdE1vZGVsIGNoaWxkKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihjaGlsZCwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRyZW4oVGVzdE1vZGVsW10gdGVzdE1vZGVscykgewotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRlc3RNb2RlbHMsIHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyQ2hpbGRyZW4oKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsIGNoaWxkTmFtZWQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJZm9yIChUZXN0TW9kZWwgY2hpbGQgOiB0aGlzLmNoaWxkcmVuKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNoaWxkIG5vdCBmb3VuZDogIiArIGNoaWxkTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGR1bXBTdHJpbmcoKSB7Ci0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIoc3cpOwotCQkJdGhpcy5kdW1wT24oaXB3KTsKLQkJCXJldHVybiBzdy50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGR1bXBPbihJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJCXdyaXRlci5wcmludGxuKHRoaXMpOwotCQkJd3JpdGVyLmluZGVudCgpOwotCQkJZm9yIChUZXN0TW9kZWwgY2hpbGQgOiB0aGlzLmNoaWxkcmVuKSB7Ci0JCQkJY2hpbGQuZHVtcE9uKHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZXIudW5kZW50KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcE9uKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSkpOwotCQkJdGhpcy5kdW1wT24od3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGR1bXAoKSB7Ci0JCQl0aGlzLmR1bXBPbihTeXN0ZW0ub3V0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIE5vZGUgd3JhcHMgYSBUZXN0TW9kZWwgYW5kIGNvbnZlcnRzIGludG8gc29tZXRoaW5nIHRoYXQgY2FuCi0JICogYmUgdXNlZCBieSBUcmVlTW9kZWxBZGFwdGVyLiBJdCBjb252ZXJ0cyBjaGFuZ2VzIHRvIHRoZSBUZXN0TW9kZWwncwotCSAqIG5hbWUgaW50byAic3RhdGUgY2hhbmdlcyIgdG8gdGhlIE5vZGU7IGFuZCBjb252ZXJ0cyB0aGUKLQkgKiBUZXN0TW9kZWwncyBjaGlsZHJlbiBpbnRvIGEgTGlzdFZhbHVlTW9kZWwgb2YgTm9kZXMgd2hvc2Ugb3JkZXIgaXMKLQkgKiBkZXRlcm1pbmVkIGJ5IHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRlc3ROb2RlIGV4dGVuZHMgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPFRlc3ROb2RlPiB7Ci0JCS8qKiB0aGUgbW9kZWwgb2JqZWN0IHdyYXBwZWQgYnkgdGhpcyBub2RlICovCi0JCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJLyoqIHRoaXMgbm9kZSdzIHBhcmVudCBub2RlOyBudWxsIGZvciB0aGUgcm9vdCBub2RlICovCi0JCXByaXZhdGUgZmluYWwgVGVzdE5vZGUgcGFyZW50OwotCQkvKiogdGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbDsKLQkJLyoqIGEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIHRoZSBtb2RlbCBvYmplY3QncyAiaW50ZXJuYWwgc3RhdGUiIGNoYW5nZXMgKi8KLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRlc3RNb2RlbExpc3RlbmVyOwotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JCS8qKgotCQkgKiByb290IG5vZGUgY29uc3RydWN0b3IKLQkJICovCi0JCXB1YmxpYyBUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQl0aGlzKG51bGwsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvKioKLQkJICogYnJhbmNoIG9yIGxlYWYgbm9kZSBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmNoaWxkcmVuTW9kZWwgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5Nb2RlbCh0ZXN0TW9kZWwpOwotCQkJdGhpcy50ZXN0TW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXN0TW9kZWxMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGVzdE1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlUZXN0Tm9kZS50aGlzLnRlc3RNb2RlbENoYW5nZWQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBzdWJjbGFzc2VzIGRlY2lkZSB0aGUgb3JkZXIgb2YgdGhlIGNoaWxkIG5vZGVzCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChUZXN0TW9kZWwgbW9kZWwpOwotCi0JCS8qKgotCQkgKiB1c2VkIGJ5IHN1YmNsYXNzZXM7Ci0JCSAqIHRyYW5zZm9ybSB0aGUgdGVzdCBtb2RlbCBjaGlsZHJlbiBpbnRvIG5vZGVzCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkTm9kZUFkYXB0ZXIoVGVzdE1vZGVsIG1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRlc3RNb2RlbCwgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRDaGlsZHJlbkFkYXB0ZXIobW9kZWwpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFRlc3ROb2RlIHRyYW5zZm9ybUl0ZW0oVGVzdE1vZGVsIGl0ZW0pIHsKLQkJCQkJcmV0dXJuIFRlc3ROb2RlLnRoaXMuYnVpbGRDaGlsZE5vZGUoaXRlbSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBzdWJjbGFzc2VzIG11c3QgYnVpbGQgYSBjb25jcmV0ZSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIHRlc3QgbW9kZWwKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGRUZXN0TW9kZWwpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIG9uIHRoZSBzcGVjaWZpZWQgbW9kZWwncyBjaGlsZHJlbgotCQkgKi8KLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RNb2RlbD4gYnVpbGRDaGlsZHJlbkFkYXB0ZXIoVGVzdE1vZGVsIG1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgVGVzdE1vZGVsPihUZXN0TW9kZWwuQ0hJTERSRU5fQ09MTEVDVElPTiwgbW9kZWwpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8VGVzdE1vZGVsPiBpdGVyYXRvcl8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jaGlsZHJlblNpemUoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGNoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZLCB0aGlzLnRlc3RNb2RlbExpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFksIHRoaXMudGVzdE1vZGVsTGlzdGVuZXIpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIERpc3BsYXlhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWwuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGRlYnVnZ2luZyBzdXBwb3J0ICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGR1bXBTdHJpbmcoKSB7Ci0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIoc3cpOwotCQkJdGhpcy5kdW1wT24oaXB3KTsKLQkJCXJldHVybiBzdy50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHVtcE9uKEluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlcikgewotCQkJd3JpdGVyLnByaW50bG4odGhpcyk7Ci0JCQl3cml0ZXIuaW5kZW50KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJLy8gY2FzdCB0byBhIFRlc3ROb2RlIChpLmUuIHRoaXMgd29uJ3Qgd29yayB3aXRoIGEgTmFtZVRlc3ROb2RlIGluIHRoZSB0cmVlKQotCQkJCSgoVGVzdE5vZGUpIHN0cmVhbS5uZXh0KCkpLmR1bXBPbih3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVyLnVuZGVudCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHVtcE9uKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSkpOwotCQkJdGhpcy5kdW1wT24od3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJCXRoaXMuZHVtcE9uKFN5c3RlbS5vdXQpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCQkvKioKLQkJICogdGhlIG1vZGVsJ3MgbmFtZSBoYXMgY2hhbmdlZCwgZm9yd2FyZCB0aGUgZXZlbnQgdG8gb3VyIGxpc3RlbmVycwotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgdGVzdE1vZGVsQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCS8vIHdlIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IG91ciAiaW50ZXJuYWwgc3RhdGUiIGhhcyBjaGFuZ2VkCi0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJCS8vIG91ciBkaXNwbGF5IHN0cmluZyBzdGF5cyBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbCdzIG5hbWUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgZS5nZXRPbGRWYWx1ZSgpLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VGVzdE1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRlc3RpbmcgY29udmVuaWVuY2UgbWV0aG9kCi0JCSAqLwotCQlwdWJsaWMgVGVzdE5vZGUgY2hpbGROYW1lZChTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IGNoaWxkTm9kZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkTm9kZSBpbnN0YW5jZW9mIFRlc3ROb2RlKSB7Ci0JCQkJCWlmICgoKFRlc3ROb2RlKSBjaGlsZE5vZGUpLmdldFRlc3RNb2RlbCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCXJldHVybiAoVGVzdE5vZGUpIGNoaWxkTm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNoaWxkIG5vdCBmb3VuZDogIiArIG5hbWUpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKFRlc3ROb2RlIG8pIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8oby5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk5vZGUoIiArIHRoaXMudGVzdE1vZGVsICsgIikiOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGtlZXBzIGl0cyBjaGlsZHJlbiBzb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNvcnRlZFRlc3ROb2RlIGV4dGVuZHMgVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFNvcnRlZFRlc3ROb2RlKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHRlc3RNb2RlbCk7Ci0JCX0KLQkJcHVibGljIFNvcnRlZFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiB0aGUgbGlzdCBzaG91bGQgYmUgc29ydGVkICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZERpc3BsYXlTdHJpbmdBZGFwdGVyKHRlc3RNb2RlbCkpOwotCQl9Ci0JCS8qKiB0aGUgZGlzcGxheSBzdHJpbmcgKG5hbWUpIG9mIGVhY2ggbm9kZSBjYW4gY2hhbmdlICovCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGREaXNwbGF5U3RyaW5nQWRhcHRlcihUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZE5vZGVBZGFwdGVyKHRlc3RNb2RlbCksIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZKTsKLQkJfQotCQkvKiogY2hpbGRyZW4gYXJlIGFsc28gc29ydGVkIG5vZGVzICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkTm9kZSkgewotCQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQgbGVhdmVzIGl0cyBjaGlsZHJlbiB1bnNvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVW5zb3J0ZWRUZXN0Tm9kZSBleHRlbmRzIFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBVbnNvcnRlZFRlc3ROb2RlKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHRlc3RNb2RlbCk7Ci0JCX0KLQkJcHVibGljIFVuc29ydGVkVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHRoZSBsaXN0IHNob3VsZCBOT1QgYmUgc29ydGVkICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVBZGFwdGVyKHRlc3RNb2RlbCk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHVuc29ydGVkIG5vZGVzICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkTm9kZSkgewotCQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMsIGNoaWxkTm9kZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBsZWF2ZXMgaXRzIGNoaWxkcmVuIHVuc29ydGVkCi0JICogYW5kIGhhcyBhIHNwZWNpYWwgc2V0IG9mIGNoaWxkcmVuIGZvciAibm9kZSAzIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3BlY2lhbFRlc3ROb2RlIGV4dGVuZHMgVW5zb3J0ZWRUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU3BlY2lhbFRlc3ROb2RlKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHRlc3RNb2RlbCk7Ci0JCX0KLQkJcHVibGljIFNwZWNpYWxUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogcmV0dXJuIGEgZGlmZmVyZW50IGxpc3Qgb2YgY2hpbGRyZW4gZm9yICJub2RlIDMiICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlpZiAodGVzdE1vZGVsLmdldE5hbWUoKS5lcXVhbHMoIm5vZGUgMyIpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRTcGVjaWFsQ2hpbGRyZW5Nb2RlbCgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmJ1aWxkQ2hpbGRyZW5Nb2RlbCh0ZXN0TW9kZWwpOwotCQl9Ci0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRTcGVjaWFsQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+W10gY2hpbGRyZW4gPSBuZXcgTmFtZVRlc3ROb2RlWzFdOwotCQkJY2hpbGRyZW5bMF0gPSBuZXcgTmFtZVRlc3ROb2RlKHRoaXMpOwotCQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4oQXJyYXlzLmFzTGlzdChjaGlsZHJlbikpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyBzcGVjaWFsIG5vZGVzICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkTm9kZSkgewotCQkJcmV0dXJuIG5ldyBTcGVjaWFsVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVUZXN0Tm9kZSBleHRlbmRzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gewotCQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JCXByaXZhdGUgZmluYWwgU3BlY2lhbFRlc3ROb2RlIHNwZWNpYWxOb2RlOwkJLy8gcGFyZW50IG5vZGUKLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG5hbWVMaXN0ZW5lcjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbDsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIE5hbWVUZXN0Tm9kZShTcGVjaWFsVGVzdE5vZGUgc3BlY2lhbE5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWVMaXN0ZW5lciA9IHRoaXMuYnVpbGROYW1lTGlzdGVuZXIoKTsKLQkJCXRoaXMuc3BlY2lhbE5vZGUgPSBzcGVjaWFsTm9kZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IG5ldyBOdWxsTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KCk7Ci0JCX0KLQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROYW1lTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlOYW1lVGVzdE5vZGUudGhpcy5uYW1lQ2hhbmdlZChlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4oVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFksIHRoaXMuZ2V0VGVzdE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VGVzdE1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lhbE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQkJcHVibGljIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IHBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnNwZWNpYWxOb2RlOwotCQl9Ci0JCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWw7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5hbWVMaXN0ZW5lcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy5uYW1lQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5uYW1lTGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkJcHJvdGVjdGVkIHZvaWQgbmFtZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkvLyB3ZSBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBvdXIgInZhbHVlIiBoYXMgY2hhbmdlZAotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbChUZXN0Tm9kZSByb290KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHJvb3QpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHJvb3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmVlTW9kZWxBZGFwdGVyPE9iamVjdD4ocm9vdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROb2RlU3RhdGVMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFJvb3RMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCi0JLyoqCi0JICogbGlzdGVuZXIgdGhhdCB3aWxsIGJsb3cgdXAgd2l0aCBhbnkgZXZlbnQ7Ci0JICogb3ZlcnJpZGUgYW5kIGltcGxlbWVudCBleHBlY3RlZCBldmVudCBtZXRob2RzCi0JICovCi0JcHVibGljIGNsYXNzIFRlc3RUcmVlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFRyZWVNb2RlbExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmNDBjMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LlRleHRGaWVsZDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlU2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVudW1lcmF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5Tb3J0ZWRUZXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVGVzdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVW5zb3J0ZWRUZXN0Tm9kZTsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHRoZSBUcmVlTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCS8vIGhvbGQgdGhlIHRyZWUgc28gd2UgY2FuIHJlc3RvcmUgaXRzIGV4cGFuc2lvbiBzdGF0ZQotCXByaXZhdGUgSlRyZWUgdHJlZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiByb290Tm9kZUhvbGRlcjsKLQlwcml2YXRlIGJvb2xlYW4gc29ydGVkOwotCXByaXZhdGUgVHJlZU1vZGVsIHRyZWVNb2RlbDsKLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25Nb2RlbCB0cmVlU2VsZWN0aW9uTW9kZWw7Ci0JcHJpdmF0ZSBUZXh0RmllbGQgbmFtZVRleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnJvb3ROb2RlSG9sZGVyID0gdGhpcy5idWlsZFJvb3ROb2RlSG9sZGVyKCk7Ci0JCXRoaXMuc29ydGVkID0gdGhpcy5yb290Tm9kZUhvbGRlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU29ydGVkVGVzdE5vZGU7Ci0JCXRoaXMudHJlZU1vZGVsID0gdGhpcy5idWlsZFRyZWVNb2RlbCgpOwotCQl0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRUcmVlU2VsZWN0aW9uTW9kZWwoKTsKLQkJdGhpcy5uYW1lVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZFJvb3ROb2RlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIGJ1aWxkUm9vdCgpIHsKLQkJVGVzdE1vZGVsIHJvb3QgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0KLQkJVGVzdE1vZGVsIG5vZGVfMSA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMSIpOwotCQkvKk5vZGUgbm9kZV8xXzEgPSAqL25vZGVfMS5hZGRDaGlsZCgibm9kZSAxLjEiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8yID0gcm9vdC5hZGRDaGlsZCgibm9kZSAyIik7Ci0JCS8qTm9kZSBub2RlXzJfMSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8yXzIgPSBub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMl8xID0gKi9ub2RlXzJfMi5hZGRDaGlsZCgibm9kZSAyLjIuMSIpOwotCQkvKk5vZGUgbm9kZV8yXzJfMiA9ICovbm9kZV8yXzIuYWRkQ2hpbGQoIm5vZGUgMi4yLjIiKTsKLQkJLypOb2RlIG5vZGVfMl8zID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4zIik7Ci0JCS8qTm9kZSBub2RlXzJfNCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNCIpOwotCQkvKk5vZGUgbm9kZV8yXzUgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjUiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8zID0gcm9vdC5hZGRDaGlsZCgibm9kZSAzIik7Ci0JCVRlc3RNb2RlbCBub2RlXzNfMSA9IG5vZGVfMy5hZGRDaGlsZCgibm9kZSAzLjEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfM18xXzEgPSBub2RlXzNfMS5hZGRDaGlsZCgibm9kZSAzLjEuMSIpOwotCQkvKk5vZGUgbm9kZV8zXzFfMV8xID0gKi9ub2RlXzNfMV8xLmFkZENoaWxkKCJub2RlIDMuMS4xLjEiKTsKLQotCQkvKk5vZGUgbm9kZV80ID0gKi9yb290LmFkZENoaWxkKCJub2RlIDQiKTsKLQotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlTW9kZWxBZGFwdGVyPE9iamVjdD4odGhpcy5yb290Tm9kZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTW9kZWwgYnVpbGRUcmVlU2VsZWN0aW9uTW9kZWwoKSB7Ci0JCVRyZWVTZWxlY3Rpb25Nb2RlbCB0c20gPSBuZXcgRGVmYXVsdFRyZWVTZWxlY3Rpb25Nb2RlbCgpOwotCQl0c20uYWRkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRzbS5zZXRTZWxlY3Rpb25Nb2RlKFRyZWVTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfVFJFRV9TRUxFQ1RJT04pOwotCQlyZXR1cm4gdHNtOwotCX0KLQotCXByaXZhdGUgVHJlZVNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChUcmVlU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy50cmVlU2VsZWN0aW9uQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHRyZWVTZWxlY3Rpb25DaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZVRleHRGaWVsZC5zZXRUZXh0KHNlbGVjdGVkVGVzdE1vZGVsLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRyZWVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRyZWVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUcmVlKCkpOwotCX0KLQotCXByaXZhdGUgSlRyZWUgYnVpbGRUcmVlKCkgewotCQl0aGlzLnRyZWUgPSBuZXcgSlRyZWUodGhpcy50cmVlTW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1RleHQoT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLQkJCQlyZXR1cm4gKChEaXNwbGF5YWJsZSkgdmFsdWUpLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy50cmVlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy50cmVlLnNldFJvb3RWaXNpYmxlKHRydWUpOwotCQl0aGlzLnRyZWUuc2V0U2hvd3NSb290SGFuZGxlcyh0cnVlKTsKLQkJdGhpcy50cmVlLnNldFJvd0hlaWdodCgyMCk7Ci0JCXRoaXMudHJlZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJcmV0dXJuIHRoaXMudHJlZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW5hbWVOb2RlUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZE1pc2NQYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbmFtZU5vZGVQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbmFtZU5vZGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLm5hbWVUZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVuYW1lTm9kZVBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWlzY1BhbmVsKCkgewotCQlKUGFuZWwgbWlzY1BhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQ2hpbGRyZW5CdXR0b24oKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBtaXNjUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVRleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQlwcml2YXRlIFRlc3ROb2RlIHNlbGVjdGVkTm9kZSgpIHsKLQkJaWYgKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuZ2V0U2VsZWN0aW9uUGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSgpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSByb290Tm9kZSgpIHsKLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIHJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VHJlZVBhdGg+IGV4cGFuZGVkUGF0aHMoKSB7Ci0JCUVudW1lcmF0aW9uPFRyZWVQYXRoPiBzdHJlYW0gPSB0aGlzLnRyZWUuZ2V0RXhwYW5kZWREZXNjZW5kYW50cyhuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxUcmVlUGF0aD4oc3RyZWFtKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZShUZXN0Tm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBhdGgoc2VsZWN0ZWROb2RlLnBhdGgoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRQYXRocyhDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocykgewotCQlmb3IgKFRyZWVQYXRoIHBhdGggOiBwYXRocykgewotCQkJdGhpcy50cmVlLmV4cGFuZFBhdGgocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZE5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogYWRkaW5nIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBzb3J0ZWQgYW5kIG5vZGVzIHRvIGJlCi0JICogcmVtb3ZlZCBhbmQgcmUtYWRkZWQ7IHNvIHdlIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXZvaWQgYWRkTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJCS8vIHNhdmUgdGhlIGV4cGFuc2lvbiBzdGF0ZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgYWRkCi0JCQlDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocyA9IHRoaXMuZXhwYW5kZWRQYXRocygpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5hZGRDaGlsZChuYW1lKTsKLQotCQkJdGhpcy5leHBhbmRQYXRocyhwYXRocyk7Ci0JCQl0aGlzLnNldFNlbGVjdGVkTm9kZSh0aGlzLnNlbGVjdGVkTm9kZSgpLmNoaWxkTmFtZWQobmFtZSkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBub2RlIHRvIHNlbGVjdCBhZnRlcgotCSAqIHRoZSBzZWxlY3RlZCBub2RlIGlzIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIHJlbW92ZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSByb290IHRvIGJlIHJlbW92ZWQKLQkJaWYgKChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSAmJiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gdGhpcy5yb290KCkpKSB7Ci0JCQkvLyBzYXZlIHRoZSBwYXJlbnQgYW5kIGluZGV4LCBzbyB3ZSBjYW4gc2VsZWN0IGFub3RoZXIsIG5lYXJieSwgbm9kZQotCQkJLy8gb25jZSB0aGUgc2VsZWN0ZWQgbm9kZSBpcyByZW1vdmVkCi0JCQlUZXN0Tm9kZSBwYXJlbnROb2RlID0gKFRlc3ROb2RlKSB0aGlzLnNlbGVjdGVkTm9kZSgpLnBhcmVudCgpOwotCQkJaW50IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZCh0aGlzLnNlbGVjdGVkTm9kZSgpKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoc2VsZWN0ZWRUZXN0TW9kZWwpOwotCi0JCQlpbnQgY2hpbGRyZW5TaXplID0gcGFyZW50Tm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCWlmIChjaGlsZEluZGV4IDwgY2hpbGRyZW5TaXplKSB7Ci0JCQkJLy8gc2VsZWN0IHRoZSBjaGlsZCB0aGF0IG1vdmVkIHVwIGFuZCByZXBsYWNlZCB0aGUganVzdC1kZWxldGVkIGNoaWxkCi0JCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoKFRlc3ROb2RlKSBwYXJlbnROb2RlLmNoaWxkKGNoaWxkSW5kZXgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuU2l6ZSA9PSAwKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuLCBzZWxlY3QgdGhlIHBhcmVudAotCQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZShwYXJlbnROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpZiB0aGUgY2hpbGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCB3YXMgZGVsZXRlZCwgc2VsZWN0IHRoZSBuZXh0IGNoaWxkIHVwCi0JCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKChUZXN0Tm9kZSkgcGFyZW50Tm9kZS5jaGlsZChjaGlsZEluZGV4IC0gMSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVuYW1lICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiByZW5hbWluZyBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgc29ydGVkIGFuZCBub2RlcyB0byBiZQotCSAqIHJlbW92ZWQgYW5kIHJlLWFkZGVkOyBzbyB3ZSBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBleHBhbnNpb24gc3RhdGUKLQkgKi8KLQl2b2lkIHJlbmFtZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIHNhdmUgdGhlIG5vZGUgYW5kIHJlLXNlbGVjdCBpdCBhZnRlciB0aGUgcmVuYW1lCi0JCQlUZXN0Tm9kZSBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZSgpOwotCQkJLy8gc2F2ZSB0aGUgZXhwYW5zaW9uIHN0YXRlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSByZW5hbWUKLQkJCUNvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzID0gdGhpcy5leHBhbmRlZFBhdGhzKCk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLnNldE5hbWUodGhpcy5nZXROYW1lKCkpOwotCi0JCQl0aGlzLmV4cGFuZFBhdGhzKHBhdGhzKTsKLQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHNlbGVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsZWFyIGNoaWxkcmVuICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckNoaWxkcmVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQ2hpbGRyZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckNoaWxkcmVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBjaGlsZHJlbiIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIG5vdGhpbmcgc3BlY2lhbCwgd2UganVzdCB3YW50IHRvIHRlc3QgI2ZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcpCi0JICovCi0Jdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFRlc3RNb2RlbC5jbGVhckNoaWxkcmVuKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0ICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IHRoZSBhZGFwdGVyJ3Mgcm9vdCBub2RlIGhvbGRlcjsKLQkgKiB0b2dnbGUgYmV0d2VlbiBzb3J0ZWQgYW5kIHVuc29ydGVkIGxpc3RzCi0JICovCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5zb3J0ZWQgPSAhIHRoaXMuc29ydGVkOwotCQlpZiAodGhpcy5zb3J0ZWQpIHsKLQkJCXRoaXMucm9vdE5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yb290Tm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJfQotCQl0aGlzLnRyZWUuZXhwYW5kUGF0aChuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTcxNDMzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBYnN0cmFjdE5vZGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCByb290OwotCi0JcHVibGljIEFic3RyYWN0Tm9kZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucm9vdCA9IHRoaXMuYnVpbGRSb290KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgciA9IG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJyb290Iik7Ci0JCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTEgPSByLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTFfMSA9IG5vZGUxLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMSIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4xIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjIiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMyIpOwotCQkJCW5vZGUxLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMiIpOwotCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUyID0gci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCQkJbm9kZTIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMi4xIik7Ci0JCQkJbm9kZTIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMi4yIik7Ci0JCQlyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDMiKTsKLQkJCXIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgNCIpOwotCi0JCS8vIG1hcmsgdGhlIGVudGlyZSB0cmVlIGNsZWFuCi0JCXIubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXJldHVybiByOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdFdvcmtiZW5jaE1vZGVsKCkgewotCQkvLyBtYWtlIHN1cmUgb3VyIHRlc3QgY2xhc3Mgd29ya3MgT0suLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMSIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikuaXNDbGVhbkJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50QW5kQ2hpbGRyZW4oKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEuMS4zIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxLjEiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb290Iiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydE51bGwobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eVVuY2hhbmdlZEF0dHJpYnV0ZSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCS8vIHNldCBzaXplIHRvIHNhbWUgbnVtYmVyIC0gc2hvdWxkIHN0YXkgY2xlYW4KLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCXBhcmVudC5zZXRTaXplKDc3KTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlub2RlLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaENsZWFuQ2hpbGREaXJ0eVBhcmVudCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0U2l6ZSg3Nyk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJLy8gbm93LCBjbGVhbiB0aGUgY2hpbGQsIGJ1dCBsZWF2ZSB0aGUgcGFyZW50IGRpcnR5Ci0JCW5vZGUubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoQ2xlYW5DaGlsZERpcnR5Q2hpbGQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4xIik7Ci0JCW5vZGUxLnNldFNpemUoNDEpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTIgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMiIpOwotCQlub2RlMi5zZXRTaXplKDQyKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZTEuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJLy8gbm93LCBjbGVhbiB0aGUgZmlyc3QgY2hpbGQsIGJ1dCBsZWF2ZSB0aGUgc2Vjb25kIGNoaWxkIGRpcnR5Ci0JCW5vZGUxLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaEZvcmNlZCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW5CcmFuY2goKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hEaXJ0eSgpOwotCi0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlUcmFuc2llbnRBdHRyaWJ1dGUoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydFRydWUodGhpcy5yb290LnByb2JsZW1zU2l6ZSgpID09IDApOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5wcm9ibGVtc1NpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG5vZGUucHJvYmxlbXNTaXplKCkgPiAwKTsKLQotCQkvLyBzaW5jZSBwcm9ibGVtcyBhcmUgdHJhbnNpZW50LCBldmVyeXRoaW5nIHNob3VsZCBzdGlsbCBiZSBjbGVhbgotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW5CcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJUHJvYmxlbSBwcm9ibGVtMSA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhbm90aGVyIHByb2JsZW0gdGhhdCBzaG91bGQgcmVtb3ZlIHRoZSBvbGQgcHJvYmxlbQotCQlub2RlLnNldE5hbWUoIlNUSUxMIEJPR1VTIik7Ci0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCVByb2JsZW0gcHJvYmxlbTIgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShwcm9ibGVtMSA9PSBwcm9ibGVtMik7Ci0JCXByb2JsZW0xID0gcHJvYmxlbTI7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhbm90aGVyIHByb2JsZW0gdGhhdCBzaG91bGQgcmVwbGFjZSB0aGUgb2xkIHByb2JsZW0KLQkJbm9kZS5zZXROYW1lKCJTVElMTCBCT0dVUyIpOwotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlwcm9ibGVtMiA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0JCS8vIHRoZSBzYW1lIHByb2JsZW0gc2hvdWxkIGJlIHRoZXJlCi0JCWFzc2VydFRydWUocHJvYmxlbTEuZXF1YWxzKHByb2JsZW0yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0KLQkJbm9kZS5zZXROYW1lKCJva2llLWRva2llIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckFsbEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0KLQkJcGFyZW50LmNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5icmFuY2hQcm9ibGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZWRCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuYnJhbmNoUHJvYmxlbXMoKSkpOwotCi0JCS8vIGNvbXBsZXRlbHkgcmVtb3ZlIGEgbm9kZSB0aGF0IGhhcyBwcm9ibGVtcyAtCi0JCS8vIHRoZSBlbnRpcmUgdHJlZSBzaG91bGQgcmVjYWxjdWxhdGUgaXRzICJicmFuY2giIHByb2JsZW1zCi0JCXBhcmVudC5yZW1vdmVUZXN0Q2hpbGQobm9kZSk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIGNsYXNzIFRlc3RXb3JrYmVuY2hNb2RlbCBleHRlbmRzIEFic3RyYWN0Tm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIGludCBzaXplOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRV9QUk9QRVJUWSA9ICJzaXplIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRlc3RXb3JrYmVuY2hNb2RlbD4gdGVzdENoaWxkcmVuOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsKFRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJCXRoaXMuc2l6ZSA9IDA7Ci0JCQl0aGlzLnRlc3RDaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RXb3JrYmVuY2hNb2RlbD4oKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkKLQkJLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5zaXplOwotCQkJdGhpcy5zaXplID0gc2l6ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0V29ya2JlbmNoTW9kZWw+IHRlc3RDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxUZXN0V29ya2JlbmNoTW9kZWw+KHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFRlc3RXb3JrYmVuY2hNb2RlbCBjdXJyZW50KSB7Ci0JCQkJCVRlc3RXb3JrYmVuY2hNb2RlbC50aGlzLnJlbW92ZVRlc3RDaGlsZChjdXJyZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBpbnQgdGVzdENoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RDaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgYWRkVGVzdENoaWxkKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0ZXN0Q2hpbGQsIHRoaXMudGVzdENoaWxkcmVuLCBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIHRlc3RDaGlsZDsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIGFkZFRlc3RDaGlsZE5hbWVkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCWlmICh0aGlzLnRlc3RDaGlsZE5hbWVkKGNoaWxkTmFtZSkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2hpbGROYW1lKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmFkZFRlc3RDaGlsZChuZXcgVGVzdFdvcmtiZW5jaE1vZGVsKHRoaXMsIGNoaWxkTmFtZSkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRlc3RDaGlsZChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbih0ZXN0Q2hpbGQsIHRoaXMudGVzdENoaWxkcmVuLCBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQgOiB0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCWlmICh0ZXN0Q2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiB0ZXN0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0RGVzY2VuZGFudE5hbWVkKFN0cmluZyBkZXNjZW5kYW50TmFtZSkgewotCQkJZm9yIChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdERlc2NlbmRhbnQgOiB0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCWlmICh0ZXN0RGVzY2VuZGFudC5nZXROYW1lKCkuZXF1YWxzKGRlc2NlbmRhbnROYW1lKSkgewotCQkJCQlyZXR1cm4gdGVzdERlc2NlbmRhbnQ7Ci0JCQkJfQotCQkJCS8vIHJlY3Vyc2UuLi4KLQkJCQl0ZXN0RGVzY2VuZGFudCA9IHRlc3REZXNjZW5kYW50LnRlc3REZXNjZW5kYW50TmFtZWQoZGVzY2VuZGFudE5hbWUpOwotCQkJCWlmICh0ZXN0RGVzY2VuZGFudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0ZXN0RGVzY2VuZGFudDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuVG8oTGlzdDxOb2RlPiBjaGlsZHJlbikgewotCQkJc3VwZXIuYWRkQ2hpbGRyZW5UbyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbi5hZGRBbGwodGhpcy50ZXN0Q2hpbGRyZW4pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCQkvLyBuYW1lcyBtdXN0IGJlIGFsbCBsb3dlcmNhc2UuLi4KLQkJCWZvciAoaW50IGkgPSB0aGlzLm5hbWUubGVuZ3RoKCk7IGktLSA+IDA7ICkgewotCQkJCWNoYXIgYyA9IHRoaXMubmFtZS5jaGFyQXQoaSk7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSAmJiAhIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotCQkJCQljdXJyZW50UHJvYmxlbXMuYWRkKHRoaXMuYnVpbGRQcm9ibGVtKCJOQU1FX01VU1RfQkVfTE9XRVJDQVNFIiwgdGhpcy5uYW1lKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFJvb3RUZXN0V29ya2JlbmNoTW9kZWwgZXh0ZW5kcyBUZXN0V29ya2JlbmNoTW9kZWwgewotCQlwdWJsaWMgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobnVsbCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQkJcmV0dXJuIE5vZGUuTlVMTF9WQUxJREFUT1I7Ci0JCX0KLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjY4MmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5Tm9kZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU5vZGVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0Tm9kZVRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlOb2RlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2YTgyZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5Bc3luY2hyb25vdXNTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCVByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsMTsKLQlTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwxOwotCUNvbW1hbmQgY29tbWFuZDE7Ci0JU3luY2hyb25pemVyIHN5bmNocm9uaXplcjE7Ci0KLQlQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDI7Ci0JU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsMjsKLQlDb21tYW5kIGNvbW1hbmQyOwotCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIyOwotCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMSA9IG5ldyBQcmltYXJ5TW9kZWwxKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwxID0gbmV3IFNlY29uZGFyeU1vZGVsMSh0aGlzLnByaW1hcnlNb2RlbDEpOwotCQl0aGlzLmNvbW1hbmQxID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSh0aGlzLnNlY29uZGFyeU1vZGVsMSk7Ci0JCXRoaXMuc3luY2hyb25pemVyMSA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDIgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMiA9IG5ldyBTZWNvbmRhcnlNb2RlbDIodGhpcy5wcmltYXJ5TW9kZWwyKTsKLQkJdGhpcy5jb21tYW5kMiA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIodGhpcy5wcmltYXJ5TW9kZWwyLCB0aGlzLnNlY29uZGFyeU1vZGVsMik7Ci0JCXRoaXMuc3luY2hyb25pemVyMiA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMik7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMi5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdG9wKHRoaXMuc3luY2hyb25pemVyMSk7Ci0JCXN0b3AodGhpcy5zeW5jaHJvbml6ZXIyKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3RvcChTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgY3RjID0gKENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShzeW5jaHJvbml6ZXIsICJjb25zdW1lclRocmVhZENvb3JkaW5hdG9yIik7Ci0JCWlmIChDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoY3RjLCAidGhyZWFkIikgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnN5bmNocm9uaXplcjEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQotCQlkZWxheSgxKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0b3AoKTsKLQkJZGVsYXkoMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjEpOwotCQkvLyB0aGUgYXN5bmMgc3luY2hyb25pemVyIGRvZXMgbm90IHN5bmNocm9uaXplIGF0IHN0YXJ0LXVwCi0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoOCk7Ci0KLQkJZGVsYXkoMSk7Ci0JCXRoaXMuc3luY2hyb25pemVyMS5zdG9wKCk7Ci0JCWRlbGF5KDEpOwotCi0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuc3RhcnRTeW5jaHJvbml6ZXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQotCQlkZWxheSgxKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0b3AoKTsKLQkJZGVsYXkoMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldENvdW50KDcpOwotCi0JCWRlbGF5KDEpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMucHJpbWFyeU1vZGVsMi5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50KCkpOwotCi0JCWRlbGF5KDEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTeW5jaHJvbml6ZXIgcyA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIobnVsbCk7Ci0JCQlmYWlsKCJib2d1czogIiArIHMpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWROYW1lKCkgewotCQlTeW5jaHJvbml6ZXIgcyA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMSwgInN5bmMiKTsKLQkJcy5zdGFydCgpOwotCQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yIGN0YyA9IChDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUocywgImNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IiKTsKLQkJVGhyZWFkIHQgPSAoVGhyZWFkKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoY3RjLCAidGhyZWFkIik7Ci0JCWFzc2VydEVxdWFscygic3luYyIsIHQuZ2V0TmFtZSgpKTsKLQkJcy5zdG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplQ2FsbGVkQmVmb3JlU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlQ29tbWFuZCBjb21tYW5kID0gbmV3IFNpbXBsZUNvbW1hbmQoKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCk7Ci0KLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCQlkZWxheSgxKTsKLQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJvZ3VzQ29tbWFuZCBjb21tYW5kID0gbmV3IEJvZ3VzQ29tbWFuZCgpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0KLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCWRlbGF5KDEpOwotCi0JCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQlkZWxheSgxKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChDb21wb3NpdGVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydEVxdWFscygyLCBleC5nZXRFeGNlcHRpb25zKCkubGVuZ3RoKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBCb2d1c0NvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGNvbW1hbmRzICoqKioqKioqKioKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwcml2YXRlIGZpbmFsIFNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDsKLQotCQlwdWJsaWMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxKFNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2Vjb25kYXJ5TW9kZWwgPSBzZWNvbmRhcnlNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHRoZSBwcmltYXJ5IG1vZGVsIChzdWJjbGFzcykgaGFzIHRvIHN5bmNocm9uaXplIHdpdGggaXRzZWxmIChzdXBlcmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyIGV4dGVuZHMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxIHsKLQkJcHJpdmF0ZSBmaW5hbCBQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDsKLQotCQlwdWJsaWMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsLCBTZWNvbmRhcnlNb2RlbDIgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKHNlY29uZGFyeU1vZGVsKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsID0gcHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaW1hcnkgbW9kZWxzICoqKioqKioqKioKLQkvKioKLQkgKiB0aGlzIG9iamVjdCB3aWxsIGNhbGwgdGhlIHN5bmNocm9uaXplciB3aGVuZXZlciBpdHMgY291bnQgY2hhbmdlcywKLQkgKiBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JCXByb3RlY3RlZCBpbnQgY291bnQgPSAyOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwxKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2V0U3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCAhPSB0aGlzLmNvdW50KSB7Ci0JCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVyKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJCWlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKHN5bmNocm9uaXplcik7Ci0JCX0KLQkJCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyID0gc3luY2hyb25pemVyOwotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemVyKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RhcnQoKTsgIC8vIHRoaXMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbgotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdG9wKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKENsYXNzVG9vbHMudG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQkJc2IuYXBwZW5kKCcoJyk7Ci0JCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKCJjb3VudD0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmNvdW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtb2RlbCBzeW5jaHJvbml6ZXMgd2l0aCBpdHNlbGYsIHRyaWdnZXJpbmcgYSByZWN1cnNpdmUgc3luY2hyb25pemF0aW9uCi0JICogd2l0aCB0aGUgY2hhbmdlLiBXaGVuZXZlciB0aGUgW2luaGVyaXRlZF0gJ2NvdW50JyBjaGFuZ2VzLCAnY291bnRQbHVzMycKLQkgKiBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkgYW5kIGFub3RoZXIgc3luY2hyb25pemUgaXMgaW5pdGlhdGVkIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMiBleHRlbmRzIFByaW1hcnlNb2RlbDEgewotCQlwcml2YXRlIGludCBjb3VudFBsdXMzID0gMDsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMigpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvdW50UGx1czMgPSB0aGlzLmNvdW50ICsgMzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnRQbHVzMygpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50UGx1czM7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRQbHVzMyhpbnQgY291bnRQbHVzMykgewotCQkJaWYgKGNvdW50UGx1czMgIT0gdGhpcy5jb3VudFBsdXMzKSB7Ci0JCQkJdGhpcy5jb3VudFBsdXMzID0gY291bnRQbHVzMzsKLQkJCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYsIHNvIHRvIHNwZWFrCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5zZXRDb3VudFBsdXMzKHRoaXMuY291bnQgKyAzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgY291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmNvdW50UGx1czMpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHNlY29uZGFyeSBtb2RlbHMgKioqKioqKioqKgotCS8qKgotCSAqIFRoaXMgZGVwZW5kZW50IG9iamVjdCB1cGRhdGVzIGl0cyAnZG91YmxlQ291bnQnIHdoZW5ldmVyIHRoZQotCSAqIFByaW1hcnlNb2RlbDEncyAnY291bnQnIGNoYW5nZXMsIHZpYSB0aGUgJ3N5bmNocm9uaXplcicuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDEgewotCQlwcm90ZWN0ZWQgZmluYWwgUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWw7Ci0JCXByb3RlY3RlZCBpbnQgZG91YmxlQ291bnQgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDEoUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJCXRoaXMuc3luY2hyb25pemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5kb3VibGVDb3VudCA9IHRoaXMucHJpbWFyeU1vZGVsLmdldENvdW50KCkgKiAyOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmRvdWJsZUNvdW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJCXNiLmFwcGVuZCgnKCcpOwotCQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCgiZG91YmxlQ291bnQ9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5kb3VibGVDb3VudCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwyIGV4dGVuZHMgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJpdmF0ZSBpbnQgZG91YmxlQ291bnRQbHVzMyA9IDA7Ci0KLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMihQcmltYXJ5TW9kZWwyIGV4dGVuZGVkUHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcihleHRlbmRlZFByaW1hcnlNb2RlbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUHJpbWFyeU1vZGVsMiBnZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpIHsKLQkJCXJldHVybiAoUHJpbWFyeU1vZGVsMikgdGhpcy5wcmltYXJ5TW9kZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQkJaW50IHRlbXAgPSB0aGlzLmdldEV4dGVuZGVkUHJpbWFyeU1vZGVsKCkuZ2V0Q291bnRQbHVzMygpICogMjsKLQkJCWlmICh0aGlzLmRvdWJsZUNvdW50UGx1czMgIT0gdGVtcCkgewotCQkJCXRoaXMuZG91YmxlQ291bnRQbHVzMyA9IHRlbXA7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERvdWJsZUNvdW50UGx1czMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudFBsdXMzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBkb3VibGVDb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnRQbHVzMyk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxheShmbG9hdCB0aWNrcykgewotCQl0cnkgewotCQkJZGVsYXlfKHRpY2tzKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGp1c3Qgc3RvcCBldmVyeXRoaW5nIGFuZCByZXR1cm4KLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxheV8oZmxvYXQgdGlja3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIGEgdGVudGggb2Ygc2Vjb25kIHBlciB0aWNrIHNob3VsZCB3b3JrLi4uCi0JCWxvbmcgbWlsbGlzZWNvbmRzID0gKGxvbmcpICh0aWNrcyAqIDEwMCk7Ci0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWlsbGlzZWNvbmRzOwotCQlsb25nIHJlbWFpbmluZyA9IG1pbGxpc2Vjb25kczsKLQkJd2hpbGUgKHJlbWFpbmluZyA+IDBMKSB7Ci0JCQlUaHJlYWQuc2xlZXAocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9KcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzg2OWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ5ZDUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTeW5jaHJvbml6ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclN0YXJ0KCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTeW5jaHJvbml6ZXJTeW5jaHJvbml6ZSgpIHsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCk7Ci0JCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3luY2hyb25pemVyU3RvcCgpIHsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCk7Ci0JCXN5bmNocm9uaXplci5zdG9wKCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTeW5jaHJvbml6ZXJUb1N0cmluZygpIHsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoc3luY2hyb25pemVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NGJmMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbDE7Ci0JU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsMTsKLQlDb21tYW5kIGNvbW1hbmQxOwotCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIxOwotCi0JUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwyOwotCVNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbDI7Ci0JQ29tbWFuZCBjb21tYW5kMjsKLQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMjsKLQotCXB1YmxpYyBTeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMSA9IG5ldyBQcmltYXJ5TW9kZWwxKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwxID0gbmV3IFNlY29uZGFyeU1vZGVsMSh0aGlzLnByaW1hcnlNb2RlbDEpOwotCQl0aGlzLmNvbW1hbmQxID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSh0aGlzLnNlY29uZGFyeU1vZGVsMSk7Ci0JCXRoaXMuc3luY2hyb25pemVyMSA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQxKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjEpOwotCi0JCXRoaXMucHJpbWFyeU1vZGVsMiA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwyID0gbmV3IFNlY29uZGFyeU1vZGVsMih0aGlzLnByaW1hcnlNb2RlbDIpOwotCQl0aGlzLmNvbW1hbmQyID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMih0aGlzLnByaW1hcnlNb2RlbDIsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIyID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuY29tbWFuZDIpOwotCQl0aGlzLnByaW1hcnlNb2RlbDIuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3luY2hyb25pemVyMS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnQoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RhcnQoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5wcmltYXJ5TW9kZWwxLnN0YXJ0U3luY2hyb25pemVyKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0b3AoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMucHJpbWFyeU1vZGVsMi5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCAjc3RvcCgpIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVmVyaWZ5IHRoYXQgbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIG9jY3VyLgotCSAqIFZlcmlmeSB0aGUgY2FsbCB0byAjc3RvcCgpIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgcGVuZGluZwotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZSAobXVzdCBzZXQge0BsaW5rICNERUJVR30gdG8gdHJ1ZSBhbmQKLQkgKiBsb29rIGF0IHRoZSBjb25zb2xlKS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKTsKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFByaW1hcnlNb2RlbDEuc2V0Q291bnQoaW50KQotCSAqICAgICAgd2hpY2ggdHJpZ2dlcnMgY2FsbCB0byBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uIG9mIFNlY29uZGFyeU1vZGVsICh3aGljaCB3aWxsIHJ1biBmb3IgMiB0aWNrczsKLQkgKiAgICAgIGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayAzKQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlCi0JICogMyAtIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZXMgZmlyc3QgZXhlY3V0aW9uIGFuZCBzaG91bGQgc3RvcDsKLQkgKiAgICAgICJzdG9wIiB0aHJlYWQgc2hvdWxkIHJ1biB0byBjb21wbGV0aW9uIG9uY2UgdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDYWxsU3RvcEZyb21Bbm90aGVyVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwzID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJLy8gYSBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCVNlY29uZGFyeU1vZGVsMyBzZWNvbmRhcnlNb2RlbDMgPSBuZXcgU2Vjb25kYXJ5TW9kZWwzKHByaW1hcnlNb2RlbDMpOwotCQlDb21tYW5kIGNvbW1hbmQzID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihwcmltYXJ5TW9kZWwzLCBzZWNvbmRhcnlNb2RlbDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMyA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kMyk7Ci0JCS8vIGFub3RoZXIgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlwcmltYXJ5TW9kZWwzLnNldFN5bmNocm9uaXplcihzeW5jaHJvbml6ZXIzKTsKLQkJc2Vjb25kYXJ5TW9kZWwzLnNldFRpY2tzKDIpOwotCi0JCWFzc2VydEVxdWFscygyLCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChwcmltYXJ5TW9kZWwzLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIzLCAyKTsKLQotCQlsb2coIkFMTCB0aHJlYWRzIHN0YXJ0Iik7Ci0JCXN0b3BUaHJlYWQuc3RhcnQoKTsKLQkJc3luY1RocmVhZC5zdGFydCgpOwotCi0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQotCQkvLyAnZG91YmxlQ291bnQnIGlzIHN5bmNocm9uaXplZDsgYnV0IHRoZSBzeW5jaHJvbml6YXRpb24gaXMgc3RvcHBlZAotCQkvLyB3aGlsZSB0aGF0IGlzIGhhcHBlbmluZyAoYnkgdGhlICdzdG9wVGhyZWFkJyksIHNvICdkb3VibGVDb3VudFBsdXMzJwotCQkvLyBkb2VzIG5vdCBnZXQgc3luY2hyb25pemVkCi0JCWFzc2VydEVxdWFscyg3LCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gdGhpcyBkb2VzIG5vdCBnZXQgdXBkYXRlZCBiZWNhdXNlIGl0IHdvdWxkJ3ZlIGJlZW4gdXBkYXRlZCBieSB0aGUKLQkJLy8gcmVjdXJzaXZlIGNhbGwgdG8gI3N5bmNocm9uaXplKCksIGJ1dCBieSB0aGF0IHRpbWUgI3N0b3AoKSBoYWQgYmVlbiBjYWxsZWQKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChmaW5hbCBQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFRocmVhZCgidHJpZ2dlciBzeW5jIikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGVsYXkodGlja3MpOwotCQkJCXByaW1hcnlNb2RlbC5zZXRDb3VudCg3KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFN0b3BUaHJlYWQoZmluYWwgU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFRocmVhZCgic3RvcCIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRlbGF5KHRpY2tzKTsKLQkJCQlsb2coIlNUT1AgdGhyZWFkIFN5bmNocm9uaXplci5zdG9wKCkiKTsKLQkJCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJCWxvZygiU1RPUCB0aHJlYWQgc3RvcCIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENvZGUgY2xvbmVkIGZyb20ge0BsaW5rICN0ZXN0U3RvcENhbGxlZEZyb21Bbm90aGVyVGhyZWFkKCl9LgotCSAqIAotCSAqIEludGVycnVwdCB0aGUgInN0b3AiIHRocmVhZCB3aGlsZSBpdCBpcyB3YWl0aW5nIGZvciB0aGUgInN5bmNoIiB0aHJlYWQgdG8gZmluaXNoLgotCSAqIFZlcmlmeSB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKiBWZXJpZnkgdGhlIGNhbGwgdG8gI3N0b3AoKSByZXR1cm5zICpiZWZvcmUqCi0JICogc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlIChtdXN0IHNldCB7QGxpbmsgI0RFQlVHfSB0byB0cnVlIGFuZAotCSAqIGxvb2sgYXQgdGhlIGNvbnNvbGUpLgotCSAqIAotCSAqIHRpY2tzOgotCSAqIDAgLSBzdGFydCAic3luYyIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAxIHRpY2spOwotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcyk7Ci0JICogICAgICBzdGFydCAiaW50ZXJydXB0IiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDMgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFByaW1hcnlNb2RlbDEuc2V0Q291bnQoaW50KQotCSAqICAgICAgd2hpY2ggdHJpZ2dlcnMgY2FsbCB0byBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uIG9mIFNlY29uZGFyeU1vZGVsICh3aGljaCB3aWxsIHJ1biBmb3IgMyB0aWNrczsKLQkgKiAgICAgIGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayA0KQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgaXQgaXMgaW50ZXJydXB0ZWQKLQkgKiAzIC0gImludGVycnVwdCIgdGhyZWFkIHdha2VzIHVwIGFuZCBpbnRlcnJ1cHRzICJzdG9wIiB0aHJlYWQ7Ci0JICogICAgICAgYm90aCB3aWxsIHJ1biB0byBjb21wbGV0aW9uIGF0IHRoYXQgcG9pbnQKLQkgKiA0IC0gc3luY2hyb25pemF0aW9uIGNvbXBsZXRlcyBmaXJzdCBleGVjdXRpb24gYW5kIHNob3VsZCBzdG9wIHNpbmNlIHRoZQotCSAqICAgICAgInN0b3AiIHRocmVhZCwgYmVmb3JlIGl0IHdhcyBpbnRlcnJ1cHRlZCwgdG9sZCB0aGUgInN5bmNoIiB0aHJlYWQgdG8gc3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRTdG9wVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwzID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJLy8gYSBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCVNlY29uZGFyeU1vZGVsMyBzZWNvbmRhcnlNb2RlbDMgPSBuZXcgU2Vjb25kYXJ5TW9kZWwzKHByaW1hcnlNb2RlbDMpOwotCQlDb21tYW5kIGNvbW1hbmQzID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihwcmltYXJ5TW9kZWwzLCBzZWNvbmRhcnlNb2RlbDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMyA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kMyk7Ci0JCS8vIGFub3RoZXIgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlwcmltYXJ5TW9kZWwzLnNldFN5bmNocm9uaXplcihzeW5jaHJvbml6ZXIzKTsKLQkJc2Vjb25kYXJ5TW9kZWwzLnNldFRpY2tzKDMpOwotCi0JCWFzc2VydEVxdWFscygyLCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChwcmltYXJ5TW9kZWwzLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIzLCAyKTsKLQkJVGhyZWFkIGludGVycnVwdFRocmVhZCA9IHRoaXMuYnVpbGRJbnRlcnJ1cHRUaHJlYWQoc3RvcFRocmVhZCwgMyk7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQkJaW50ZXJydXB0VGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3RvcFRocmVhZC5qb2luKCk7Ci0JCXN5bmNUaHJlYWQuam9pbigpOwotCQlpbnRlcnJ1cHRUaHJlYWQuam9pbigpOwotCi0JCS8vICdkb3VibGVDb3VudCcgaXMgc3luY2hyb25pemVkOyBidXQgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBzdG9wcGVkCi0JCS8vIHdoaWxlIHRoYXQgaXMgaGFwcGVuaW5nIChieSB0aGUgJ3N0b3BUaHJlYWQnKSwgc28gJ2RvdWJsZUNvdW50UGx1czMnCi0JCS8vIGRvZXMgbm90IGdldCBzeW5jaHJvbml6ZWQKLQkJYXNzZXJ0RXF1YWxzKDcsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyB0aGlzIGRvZXMgbm90IGdldCB1cGRhdGVkIGJlY2F1c2UgaXQgd291bGQndmUgYmVlbiB1cGRhdGVkIGJ5IHRoZQotCQkvLyByZWN1cnNpdmUgY2FsbCB0byAjc3luY2hyb25pemUoKSwgYnV0IGJ5IHRoYXQgdGltZSAjc3RvcCgpIGhhZCBiZWVuIGNhbGxlZAotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCS8qKgotCSAqIENvZGUgY2xvbmVkIGZyb20ge0BsaW5rICN0ZXN0U3RvcENhbGxlZEZyb21Bbm90aGVyVGhyZWFkKCl9LgotCSAqIAotCSAqIEludGVycnVwdCB0aGUgInN5bmMiIHRocmVhZCB3aGlsZSBpdCBpcyBzeW5jaHJvbml6aW5nLCBjdXR0aW5nIHNob3J0IHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICogVmVyaWZ5IHRoYXQgbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIG9jY3VyLgotCSAqIFZlcmlmeSB0aGUgY2FsbCB0byAjc3RvcCgpIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgcGVuZGluZwotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBzdG9wcyBhZnRlciBpdCBpcyBpbnRlcnJ1cHRlZCAobXVzdCBzZXQge0BsaW5rICNERUJVR30gdG8gdHJ1ZSBhbmQKLQkgKiBsb29rIGF0IHRoZSBjb25zb2xlKS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKQotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcykKLQkgKiAgICAgIHN0YXJ0ICJpbnRlcnJ1cHQiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMyB0aWNrcykKLQkgKiAxIC0gInN5bmMiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgUHJpbWFyeU1vZGVsMS5zZXRDb3VudChpbnQpCi0JICogICAgICB3aGljaCB0cmlnZ2VycyBjYWxsIHRvIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIHRvIGJlZ2luCi0JICogICAgICBzeW5jaHJvbml6YXRpb24gb2YgU2Vjb25kYXJ5TW9kZWwgKHdoaWNoIHdpbGwgcnVuIGZvciA0IHRpY2tzOwotCSAqICAgICAgaS5lLiBpdCB3aWxsIGZpbmlzaCBvbiB0aWNrIDUpCi0JICogMiAtICJzdG9wIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdG9wKCkgYW5kIHNob3VsZAotCSAqICAgICAgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGlzIGludGVycnVwdGVkCi0JICogMyAtICJpbnRlcnJ1cHQiIHRocmVhZCB3YWtlcyB1cCBhbmQgaW50ZXJydXB0cyAic3luYyIgdGhyZWFkOwotCSAqICAgICAgdGhlICJpbnRlcnJ1cHQiIHRocmVhZCBydW5zIHRvIGNvbXBsZXRpb24sIHdoaWxlIHRoZSAic3luYyIgdGhyZWFkIGtlZXBzCi0JICogICAgICBnb2luZyBmb3IgYW5vdGhlciB0aWNrIGJlZm9yZSBpdCBzdG9wcyBpbiAibWlkLXN5bmNocm9uaXplIgotCSAqIDQgLSB0aGUgInN5bmMiIHRocmVhZCBhY2tub3dsZWRnZXMgdGhlIGludGVycnVwdCBhbmQgc3RvcHMgaW4KLQkgKiAgICAgICJtaWQtc3luY2hyb25pemUiOyBpdCB3aWxsIHN0b3Agc2luY2UgdGhlICJzdG9wIiB0aHJlYWQgdG9sZCBpdCB0byBhdCB0aWNrIDI7Ci0JICogICAgICB0aGUgInN5bmMiIGFuZCAic3RvcCIgdGhyZWFkcyBydW4gdG8gY29tcGxldGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRTeW5jVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwzID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJLy8gYSBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCVNlY29uZGFyeU1vZGVsMyBzZWNvbmRhcnlNb2RlbDMgPSBuZXcgU2Vjb25kYXJ5TW9kZWwzKHByaW1hcnlNb2RlbDMpOwotCQlDb21tYW5kIGNvbW1hbmQzID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihwcmltYXJ5TW9kZWwzLCBzZWNvbmRhcnlNb2RlbDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMyA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kMyk7Ci0JCS8vIGFub3RoZXIgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlwcmltYXJ5TW9kZWwzLnNldFN5bmNocm9uaXplcihzeW5jaHJvbml6ZXIzKTsKLQkJc2Vjb25kYXJ5TW9kZWwzLnNldFRpY2tzKDQpOwotCi0JCWFzc2VydEVxdWFscygyLCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVRocmVhZChwcmltYXJ5TW9kZWwzLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIzLCAyKTsKLQkJVGhyZWFkIGludGVycnVwdFRocmVhZCA9IHRoaXMuYnVpbGRJbnRlcnJ1cHRUaHJlYWQoc3luY1RocmVhZCwgMyk7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQkJaW50ZXJydXB0VGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3RvcFRocmVhZC5qb2luKCk7Ci0JCXN5bmNUaHJlYWQuam9pbigpOwotCQlpbnRlcnJ1cHRUaHJlYWQuam9pbigpOwotCi0JCWFzc2VydEVxdWFscyg3LCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQotCQkvLyBub25lIG9mIHRoZSBzZWNvbmRhcnkgbW9kZWwgaXMgc3luY2hyb25pemVkIGJlY2F1c2UgdGhlIHN5bmNocm9uaXplKCkKLQkJLy8gbWV0aG9kIHdhcyBpbnRlcnJ1cHRlZCBiZWZvcmUgYW55IHN5bmNocm9uaXphdGlvbiBoYWQgb2NjdXJyZWQKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZEludGVycnVwdFRocmVhZChmaW5hbCBUaHJlYWQgdGhyZWFkLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkKCJpbnRlcnJ1cHQiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkZWxheSh0aWNrcyk7Ci0JCQkJbG9nKCJJTlRFUlJVUFQgdGhyZWFkIFRocmVhZC5pbnRlcnJ1cHQoKSIpOwotCQkJCXRocmVhZC5pbnRlcnJ1cHQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsICNzdG9wKCkgZHVyaW5nIGEgbG9uZy1ydW5uaW5nICJzeW5jaHJvbml6ZSI7IHRoZW4gY2FsbCAjc3RhcnQoKQotCSAqIHdoaWxlIHRoZSAjc3RvcCgpIGlzIHdhaXRpbmcgZm9yIHRoZSAic3luY2hyb25pemUiIHRvIGNvbXBsZXRlLgotCSAqIAotCSAqIHRpY2tzOgotCSAqIDAgLSBzdGFydCAic3luYyIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAxIHRpY2spCi0JICogICAgICBzdGFydCAic3RvcCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAyIHRpY2tzKQotCSAqICAgICAgc3RhcnQgInN0YXJ0IiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDMgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIHRvIGJlZ2luCi0JICogICAgICBzeW5jaHJvbml6YXRpb24gKHdoaWNoIHdpbGwgcnVuIGZvciAzIHRpY2tzOyBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgNCkKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIHRoZSBzeW5jaHJvbml6YXRpb24gaXMgZmluaXNoZWQgKGkuZS4gdGljayA0KQotCSAqIDMgLSAic3RhcnQiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0YXJ0KCkKLQkgKiAgICAgIHdoaWNoIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCi0JICogNCAtIHRoZSAic3luYyIgdGhyZWFkIGZpbmlzaGVzIGV4ZWN1dGlvbjsKLQkgKiAgICAgIGl0IHdpbGwgc3RvcCBzaW5jZSB0aGUgInN0b3AiIHRocmVhZCB0b2xkIGl0IHRvIGF0IHRpY2sgMjsKLQkgKiAgICAgIHRoZSAic3luYyIgYW5kICJzdG9wIiB0aHJlYWRzIHJ1biB0byBjb21wbGV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhbGxTdGFydER1cmluZ1N0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9nKCI9PT09PSIgKyB0aGlzLmdldE5hbWUoKSArICI9PT09PSIpOwotCQlEZWxheUNvbW1hbmQgY29tbWFuZCA9IHRoaXMuYnVpbGREZWxheUNvbW1hbmQoMyk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCi0JCVRocmVhZCBzeW5jVGhyZWFkID0gdGhpcy5idWlsZFN5bmNocm9uaXplVGhyZWFkKHN5bmNocm9uaXplciwgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyLCAyKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBleENhdWdodCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQkJVGhyZWFkIHN0YXJ0VGhyZWFkID0gdGhpcy5idWlsZFN0YXJ0VGhyZWFkKHN5bmNocm9uaXplciwgMywgZXhDYXVnaHQpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3luY1RocmVhZC5zdGFydCgpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN0YXJ0VGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3luY1RocmVhZC5qb2luKCk7Ci0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzdGFydFRocmVhZC5qb2luKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXByaXZhdGUgRGVsYXlDb21tYW5kIGJ1aWxkRGVsYXlDb21tYW5kKGZsb2F0IHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgRGVsYXlDb21tYW5kKHRpY2tzKTsKLQl9Ci0KLQljbGFzcyBEZWxheUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJZmluYWwgZmxvYXQgdGlja3M7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlpbnQgY291bnQgPSAwOwotCi0JCURlbGF5Q29tbWFuZChmbG9hdCB0aWNrcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGlja3MgPSB0aWNrczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciB0aGUgZmlyc3QgY2FsbCAoZnJvbSAjc3RhcnQoKSkKLQkJCWlmICh0aGlzLmZpcnN0KSB7Ci0JCQkJbG9nKCJFWEVDIGZpcnN0Iik7Ci0JCQkJdGhpcy5maXJzdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxvZygiRVhFQyBzdGFydCAiICsgdGhpcy5jb3VudCk7Ci0JCQlkZWxheSh0aGlzLnRpY2tzKTsKLQkJCWxvZygiRVhFQyBzdG9wICIgKyB0aGlzLmNvdW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRTdGFydFRocmVhZChmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzLCBmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkKCJzdGFydCIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRlbGF5KHRpY2tzKTsKLQkJCQlsb2coIlNUQVJUIHRocmVhZCBTeW5jaHJvbml6ZXIuc3RhcnQoKSIpOwotCQkJCXRyeSB7Ci0JCQkJCXN5bmNocm9uaXplci5zdGFydCgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodC5zZXRUcnVlKCk7Ci0JCQkJCWxvZygiU1RBUlQgdGhyZWFkIGV4Y2VwdGlvbiIpOwotCQkJCX0KLQkJCQlsb2coIlNUQVJUIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRTeW5jaHJvbml6ZVRocmVhZChmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkKCJzeW5jaHJvbml6ZSIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRlbGF5KHRpY2tzKTsKLQkJCQlsb2coIlNZTkMgdGhyZWFkIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIik7Ci0JCQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCb2d1c0NvbW1hbmQgY29tbWFuZCA9IG5ldyBCb2d1c0NvbW1hbmQoKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0KLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyB3ZSB1c2VkIHRvIGhhbmcgaGVyZSwgYmVmb3JlIHdlIGJlZ2FuIGhhbmRsaW5nIGV4Y2VwdGlvbnMKLQkJCXN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKENvbXBvc2l0ZUV4Y2VwdGlvbiBleCkgewotCQkJYXNzZXJ0RXF1YWxzKDEsIGV4LmdldEV4Y2VwdGlvbnMoKS5sZW5ndGgpOwotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQkvLyBzdGFydCArIHN5bmNocm9uaXplCi0JCWFzc2VydEVxdWFscygyLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQm9ndXNDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQlpZiAodGhpcy5jb3VudCA+IDEpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSBjb21tYW5kcyAqKioqKioqKioqCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMShTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsID0gc2Vjb25kYXJ5TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgcHJpbWFyeSBtb2RlbCAoc3ViY2xhc3MpIGhhcyB0byBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiAoc3VwZXJjbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMiBleHRlbmRzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSB7Ci0JCXByaXZhdGUgZmluYWwgUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcihzZWNvbmRhcnlNb2RlbCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IG1vZGVscyAqKioqKioqKioqCi0JLyoqCi0JICogdGhpcyBvYmplY3Qgd2lsbCBjYWxsIHRoZSBzeW5jaHJvbml6ZXIgd2hlbmV2ZXIgaXRzIGNvdW50IGNoYW5nZXMsCi0JICogYWxsb3dpbmcgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMSB7Ci0JCXByb3RlY3RlZCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMjsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgIT0gdGhpcy5jb3VudCkgewotCQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQlpZiAoc3luY2hyb25pemVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCXRoaXMuc2V0U3luY2hyb25pemVyXyhzeW5jaHJvbml6ZXIpOwotCQl9Ci0JCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0U3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXplcigpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7ICAvLyB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24KLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJCXNiLmFwcGVuZCgnKCcpOwotCQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCgiY291bnQ9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5jb3VudCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbW9kZWwgc3luY2hyb25pemVzIHdpdGggaXRzZWxmLCB0cmlnZ2VyaW5nIGEgcmVjdXJzaXZlIHN5bmNocm9uaXphdGlvbgotCSAqIHdpdGggdGhlIGNoYW5nZS4gV2hlbmV2ZXIgdGhlIFtpbmhlcml0ZWRdICdjb3VudCcgY2hhbmdlcywgJ2NvdW50UGx1czMnCi0JICogaXMgdXBkYXRlZCBhcHByb3ByaWF0ZWx5IGFuZCBhbm90aGVyIHN5bmNocm9uaXplIGlzIGluaXRpYXRlZCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlNb2RlbDIgZXh0ZW5kcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJpdmF0ZSBpbnQgY291bnRQbHVzMyA9IDA7Ci0KLQkJcHVibGljIFByaW1hcnlNb2RlbDIoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb3VudFBsdXMzID0gdGhpcy5jb3VudCArIDM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50UGx1czMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudFBsdXMzOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHNldENvdW50UGx1czMoaW50IGNvdW50UGx1czMpIHsKLQkJCWlmIChjb3VudFBsdXMzICE9IHRoaXMuY291bnRQbHVzMykgewotCQkJCXRoaXMuY291bnRQbHVzMyA9IGNvdW50UGx1czM7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHN5bmNocm9uaXplIHdpdGggaXRzZWxmLCBzbyB0byBzcGVhawotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuc2V0Q291bnRQbHVzMyh0aGlzLmNvdW50ICsgMyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCIsIGNvdW50UGx1czM9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5jb3VudFBsdXMzKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBzZWNvbmRhcnkgbW9kZWxzICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGRlcGVuZGVudCBvYmplY3QgdXBkYXRlcyBpdHMgJ2RvdWJsZUNvdW50JyB3aGVuZXZlciB0aGUKLQkgKiBQcmltYXJ5TW9kZWwxJ3MgJ2NvdW50JyBjaGFuZ2VzLCB2aWEgdGhlICdzeW5jaHJvbml6ZXInLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsOwotCQlwcm90ZWN0ZWQgaW50IGRvdWJsZUNvdW50ID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwxKFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuZG91YmxlQ291bnQgPSB0aGlzLnByaW1hcnlNb2RlbC5nZXRDb3VudCgpICogMjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQoQ2xhc3NUb29scy50b1N0cmluZ0NsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImRvdWJsZUNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMiBleHRlbmRzIFNlY29uZGFyeU1vZGVsMSB7Ci0JCXByaXZhdGUgaW50IGRvdWJsZUNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDIoUHJpbWFyeU1vZGVsMiBleHRlbmRlZFByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoZXh0ZW5kZWRQcmltYXJ5TW9kZWwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFByaW1hcnlNb2RlbDIgZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFByaW1hcnlNb2RlbDIpIHRoaXMucHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJc3VwZXIuc3luY2hyb25pemUoKTsKLQkJCWludCB0ZW1wID0gdGhpcy5nZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpLmdldENvdW50UGx1czMoKSAqIDI7Ci0JCQlpZiAodGhpcy5kb3VibGVDb3VudFBsdXMzICE9IHRlbXApIHsKLQkJCQl0aGlzLmRvdWJsZUNvdW50UGx1czMgPSB0ZW1wOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnRQbHVzMzsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgZG91YmxlQ291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50UGx1czMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgdGltZSByZXF1aXJlZCB0byBzeW5jaHJvbml6ZSB0byBiZSBzcGVjaWZpZWQuCi0JICogQSAobm9uLWRlbGF5ZWQpIHN5bmNocm9uaXplIHdpbGwgZXhlY3V0ZSBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0bwotCSAqIGNoYW5nZSB0aGUgdGljayBjb3VudC4gKEl0IGlzIGNhbGxlZCBpbiB0aGUgU2Vjb25kYXJ5TW9kZWwxIGNvbnN0cnVjdG9yLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMyBleHRlbmRzIFNlY29uZGFyeU1vZGVsMiB7Ci0JCXByaXZhdGUgbG9uZyB0aWNrcyA9IDA7Ci0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDMoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKHByaW1hcnlNb2RlbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUaWNrcyhsb25nIHRpY2tzKSB7Ci0JCQl0aGlzLnRpY2tzID0gdGlja3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQkvLyBkb24ndCBsb2cgYW55dGhpbmcgdW50aWwgJ3RpY2tzJyBpcyBzZXQKLQkJCWlmICh0aGlzLnRpY2tzID09IDApIHsKLQkJCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2coIlNZTkMgdGhyZWFkIHN0YXJ0IC0gc3luYyBkdXJhdGlvbiB3aWxsIGJlOiAiICsgdGhpcy50aWNrcyArICIgdGlja3MiKTsKLQkJCQl0cnkgewotCQkJCQlkZWxheV8odGhpcy50aWNrcyk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJbG9nKCJTWU5DIHRocmVhZCBpbnRlcnJ1cHRlZCIpOwotCQkJCQlkZWxheSgxKTsKLQkJCQkJcmV0dXJuOyAgLy8gc3RvcCBzeW5jaHJvbml6ZSAoaS5lLiBkb24ndCBjYWxsIHN1cGVyLnN5bmNocm9uaXplKCkpCi0JCQkJfQotCQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RERUJVRygpIHsKLQkJYXNzZXJ0RmFsc2UoREVCVUcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlsb2dfKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dfKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQodGltZXN0YW1wKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50KCcgJyk7Ci0JCVN5c3RlbS5vdXQucHJpbnQobWVzc2FnZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlIDEwMDAwKSAvIDEwMDBmKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsYXkoZmxvYXQgdGlja3MpIHsKLQkJdHJ5IHsKLQkJCWRlbGF5Xyh0aWNrcyk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBqdXN0IHN0b3AgZXZlcnl0aGluZyBhbmQgcmV0dXJuCi0JCQlsb2coIklOVEVSUlVQVCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGF5XyhmbG9hdCB0aWNrcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJLy8gYSB0ZW50aCBvZiBzZWNvbmQgcGVyIHRpY2sgc2hvdWxkIHdvcmsuLi4KLQkJbG9uZyBtaWxsaXNlY29uZHMgPSAobG9uZykgKHRpY2tzICogMTAwKTsKLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBtaWxsaXNlY29uZHM7Ci0JCWxvbmcgcmVtYWluaW5nID0gbWlsbGlzZWNvbmRzOwotCQl3aGlsZSAocmVtYWluaW5nID4gMEwpIHsKLQkJCVRocmVhZC5zbGVlcChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvdGVzdC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2FiN2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5KcHRVdGlsaXR5VGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iIi8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCwgc3VpdGUsIGNsZWFudXAiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK